日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript学习笔记:你必须要懂的原生JS(一)

發布時間:2025/3/16 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript学习笔记:你必须要懂的原生JS(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?1、原始類型有哪幾種?null是對象嗎?原始數據類型和復雜數據類型存儲有什么區別?

  • 原始類型有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 R
function 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接口后才能使用??梢灾袛嘌h

  • for...in循環:遍歷對象自身的和繼承的科枚舉的屬性,不能直接獲取屬性值??梢灾袛嘌h

  • 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);
    // 第二種方法
    [...arrayLike];
    // 第三種方法:
    Array.from(arrayLike);

    任何定義了遍歷器接口的對象,都可以用擴展運算符轉為真正的數組

    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(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。