javascript
JavaScript学习笔记:你必须要懂的原生JS(一)
?
-
原始類型有6種,分別是undefined,null,bool,string,number,symbol(ES6新增)
-
雖然typeof null返回的值是object,但是null不是對象,而是基本數據類型的一種
-
原始數據類型存儲在棧內存,存儲的是值
-
復雜數據類型的地址存儲在棧內存,指向存儲在堆內存的值。當我們把對象賦值給另外一個變量的時候,復制的是地址,指向同一塊內存空間,當其中一個對象改變時,另一個對象也會變化
2、typeof能否正確判斷類型?instanceof呢?instanceof的實現原理是什么?
首先typeof能夠正確地判斷基本數據類型,但是除了null,typeof null輸出的是對象
但是對對象來說,typeof不能正確地判斷其類型,typeof一個函數可以輸出'function',而除此之外,輸出的全是object,這種情況下,我們無法準確的知道對象的類型
instanceof可以準確地判斷復雜數據類型,但是不能正確判斷基本數據類型。
instanceof是通過原型鏈判斷的,A instanceof B,在A的原型鏈中層層查找,是否有原型等于B.prototype,如果一直找到A的原型鏈的頂端(null;即Object.prototype.proto),仍然不等于B.prototype,那么返回false,否則返回true
instanceof的實現代碼:
// L instanceof Rfunction instance_of(L, R) {//L 表示左表達式,R 表示右表達式
? ?var O = R.prototype;// 取 R 的顯式原型
? ?L = L.__proto__; ? ?// 取 L 的隱式原型
? ?while (true) {
? ? ? ?if (L === null) // 已經找到頂層
? ? ? ? ? ?return false;
? ? ? ?if (O === L) ? // 當 O 嚴格等于 L 時,返回 true
? ? ? ? ? ?return true;
? ? ? ?L = L.__proto__; ?// 繼續向上一層原型鏈查找
? }
}
3、for of,for in和foreach,map的區別
-
for...of循環:具有iterator接口,就可以用for...of循環遍歷它的成員(屬性值)。for...of循環可以使用的范圍包括數組、Set和Map結構、某些類似數組的對象、Generator對象,以及字符串。for...of循環調用遍歷器接口,數組的遍歷器接口只返回具有數字索引的屬性。對于普通的對象,for...of結構不能直接使用,會報錯,必須部署了Iterator接口后才能使用。可以中斷循環
-
for...in循環:遍歷對象自身的和繼承的科枚舉的屬性,不能直接獲取屬性值。可以中斷循環
-
forEach:只能遍歷數組,不能中斷,沒有返回值(或認為返回值是undefined)
-
map:只能遍歷數組,不能中斷,返回值是修改后的數組
4、如何判斷一個變量是不是數組?
-
使用Array.isArray判斷,如果返回true,說明是數組;
-
使用instanceof Array判斷,如果返回true,說明是數組;
-
使用Object.prototype.toString.call判斷,如果值是[object Array],說明是數組;
-
通過constructor來判斷,如果是數組,那么arr.constructor === Array(不準確,因為可以指定obj.constructor = Array)
5、類數組和數組的區別是什么?
類數組:
擁有length屬性,其他屬性(索引)為非負整數(對象中的索引會被當做字符串來處理)
不具有數組所具有的方法
類數組是一個普通對象,而真實的數組是Array類型
常見的類數組有:函數的參數arguments,DOM對象列表(比如通過document.querySelectorAll得到的列表),jQuery對象(比如$("div"))
類數組可以轉換為數組
// 第一種方法Array.prototype.slice.call(arrayLike, start);
// 第二種方法
[
任何定義了遍歷器接口的對象,都可以用擴展運算符轉為真正的數組
Array.from方法用于將兩類對象轉為真正的數組:類似數組的對象(array-like object)和可遍歷(iterable)的對象
6、== 和 === 有什么區別?
===不需要進行類型轉換,只有類型相同并且值相等時,才返回true
==如果兩者類型不同,首先需要進行類型轉換。具體流程如下:
首先判斷兩者類型是否相同,如果相等,判斷值是否相等;
如果類型不同,進行類型轉換;
判斷比較的是否是null或者是undefined,如果是,返回true;
判斷兩者類型是否為string和number,如果是,將字符串轉換成number;
判斷其中一方是否為boolean,如果是,將boolean轉為number再進行判斷;
判斷其中一方是否為object且另一方為string、number或者symbol,如果是,將object轉為原始類型再進行判斷。
注意復雜數據類型,===比較的是引用地址
7、ES6中的class和ES5中的類有什么區別?
ES6 class 內部所有定義的方法都是不可枚舉的;
ES6 class 必須使用new調用;
ES6 class 不存在變量提升;
ES6 class 默認即是嚴格模式;
ES6 class 子類必須在父類的構造函數中調用super(),這樣才有this對象;ES5中類繼承的關系是相反的,現有子類的this,然后用父類的方法應用在this上。
8、數組的哪些API會改變原數組?
修改原數組的API有:splice/reverse/fill/copyWithin/sort/push/pop/unshift/shift
不修改原數組的API有:slice/map/forEach/every/filter/reduce/entry/entries/find
注:數組的每一項是簡單數據類型,且未直接操作數組的情況下。
9、let、const以及var的區別是什么?
-
let和const定義的變量不會出現變量提升,而var定義的變量會提升;
-
let和const是JS中的塊級作用域;
-
let和const不允許重復聲明;
-
let和const定義的變量在定義語句之前,如果使用會拋出錯誤,而var不會;
10、在JS中什么是變量提升?什么是暫時性死區?
變量提升就是變量在聲明之前就可以使用,值為undefined
在代碼塊內,使用let/const命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區“。暫時性死區也意味著typeof不再是一個百分百安全的操作
typeof x;//ReferenceError(暫時性死區,拋錯)
let x;
typeof y;//值是undefined,不會報錯
轉載于:https://www.cnblogs.com/smalldy/p/10695199.html
總結
以上是生活随笔為你收集整理的JavaScript学习笔记:你必须要懂的原生JS(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火了!堪称神级的 Spring Boot
- 下一篇: 100篇架构文章打包,及offer面试题