最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js類(lèi)型判斷內(nèi)部實(shí)現(xiàn)原理示例詳解

 更新時(shí)間:2023年07月14日 09:02:45   作者:。。。嗯  
這篇文章主要為大家介紹了js類(lèi)型判斷內(nèi)部實(shí)現(xiàn)原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

typeof

typeof 操作符唯一的目的就是檢查數(shù)據(jù)類(lèi)型

類(lèi)型typeof 結(jié)果
基本類(lèi)型undefinedundefined
Booleanboolean
Numbernumber
Stringstring
Symbolsymbol
BigIntbigint
nullobject
引用類(lèi)型Object(Object, Array, Map, Set, Regexp, Date 等)object
Functionfunction

你會(huì)發(fā)現(xiàn)用typeof來(lái)判斷引用類(lèi)型時(shí), 都會(huì)返回 'object'. 為此, 引入了 instanceof

instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上。

var arr = [];
arr instanceof Array; // true
typeof arr; // "object"
function A() {}
function B() {}
// Javascript 繼承
B.prototype = new A();
var b = new B();
b instanceof A; // true
b instanceof B; // true

instanceof 的內(nèi)部實(shí)現(xiàn)原理

  • 思路:

利用 原型和原型鏈, 每一個(gè)函數(shù)都有一個(gè)顯式的 prototype, 每一個(gè)對(duì)象都有一個(gè)隱式原型 **proto**, 當(dāng)我們對(duì)象的原型鏈中存在構(gòu)造函數(shù)的顯式原型 prototype時(shí), 我們就可以確定它們之間存在關(guān)系;

function myInstanceOf(constructor, instance) {
  let prototype = constructor.prototype;
  let proto = instance.__proto__;
  while (true) {
    // 說(shuō)明道原型鏈訂單, 還未找到, 返回 false
    if (proto === null) {
      return false;
    }
    if (proto === prototype) {
      return true;
    }
    // 繼續(xù)向 proto 的原型鏈上遍歷
    proto = Object.getPrototypeOf(proto);
  }
}

Object.prototype.toString()

  • toString() 方法返回一個(gè)表示該對(duì)象的字符串。該方法旨在重寫(xiě)(自定義)派生類(lèi)對(duì)象的類(lèi)型轉(zhuǎn)換的邏輯。
  • valueOf() 方法返回對(duì)象的原始值表示

該方法由 字符串轉(zhuǎn)換優(yōu)先調(diào)用, 但是 數(shù)字的強(qiáng)制轉(zhuǎn)換原始值的強(qiáng)制轉(zhuǎn)換 會(huì)優(yōu)先調(diào)用 valueOf, 因?yàn)榛镜?nbsp;valueOf() 方法返回一個(gè)對(duì)象,toString() 方法通常在結(jié)束時(shí)調(diào)用

默認(rèn)情況下(不重寫(xiě) toString方法), 任何一個(gè)對(duì)象調(diào)用 Object原生的 toString方法, 都會(huì)返回一個(gè) [object type], 其中 type是對(duì)象的類(lèi)型

let a = {};
a; // {}
a.toString(); // "[object Object]"

[[class]]

每個(gè) 實(shí)例 都有一個(gè) [[Class]] 屬性,這個(gè)屬性中就指定了上述字符串中的 type 。 [[Class]] 不能直接地被訪問(wèn),但通??梢酝ㄟ^(guò) Object.prototype.toString.call(..) 方法調(diào)用來(lái)展示。

// Boolean 類(lèi)型,tag 為 "Boolean"
Object.prototype.toString.call(true); // => "[object Boolean]"
// Number 類(lèi)型,tag 為 "Number"
Object.prototype.toString.call(10); // => "[object Boolean]"
// String 類(lèi)型,tag 為 "String"
Object.prototype.toString.call("1312312"); // => "[object String]"
// Array 類(lèi)型,tag 為 "String"
Object.prototype.toString.call([]); // => "[object Array]"
// Function 類(lèi)型, tag 為 "Function"
Object.prototype.toString.call(function () {}); // => "[object Function]"
// Error 類(lèi)型(包含子類(lèi)型),tag 為 "Error"
Object.prototype.toString.call(new Error()); // => "[object Error]"
// RegExp 類(lèi)型,tag 為 "RegExp"
Object.prototype.toString.call(/\d+/); // => "[object RegExp]"
// Date 類(lèi)型,tag 為 "Date"
Object.prototype.toString.call(new Date()); // => "[object Date]"
// 其他類(lèi)型,tag 為 "Object"
Object.prototype.toString.call(new (class {})()); // => "[object Object]"

所以可以通過(guò)這個(gè)方法來(lái)判斷每個(gè)對(duì)象的類(lèi)型

function generator(type){
  return function(value){
    return Object.prototype.toString.call(value) === "[object "+ type +"]"
  }
}
let isFunction = generator('Function')
let isArray = generator('Array');
let isDate = generator('Date');
let isRegExp = generator('RegExp');
isArray([]));    // true
isDate(new Date()); // true
isRegExp(/\w/); // true
isFunction(function(){}); //true

以下是一道簡(jiǎn)單的面試題

+[1 + [2] + 3] + [1 + 2 + true - false] + [[3 - false + "1"]];
// 拆分一下
let a = +[1 + [2] + 3];
// [2]會(huì)首先進(jìn)行轉(zhuǎn)換 [2].valueOf, 結(jié)果不是基本類(lèi)型, [2]在調(diào)用toString(), 返回'2', 最后 1 + '2' + 3, 1,3進(jìn)行隱式轉(zhuǎn)換, +'123' ==> 123
let b = [1 + 2 + true - false];
// [3+true-false], true, false會(huì)進(jìn)行轉(zhuǎn)換, true=>1, false=>0, 最后1-0==>[1+3]==>[4]==>[4].valueOf().toString()==>'4'
let c = [[3 - false + "1"]];
// 先轉(zhuǎn)換數(shù)組里面的一層, [3-0+'1']==>['31'], 結(jié)果: [['31']]==>[['31']].valueOf().toString()==>'31'
// 最后 a+b+c
// 123+'4'+'31'==>123431

面試題目, 如何同時(shí)讓等式成立, a===1&&a===2&&a===3

思路:

重寫(xiě) a 的 valueOf 方法

let a = {
  value: [3, 2, 1],
  valueOf: function () {
    return this.value.pop();
  },
};

總結(jié)

  • 當(dāng)一側(cè)為 String 類(lèi)型,被識(shí)別為字符串拼接,并會(huì)優(yōu)先將另一側(cè)轉(zhuǎn)換為字符串類(lèi)型。
  • 當(dāng)一側(cè)為 Number 類(lèi)型,另一側(cè)為原始類(lèi)型,則將原始類(lèi)型轉(zhuǎn)換為 Number 類(lèi)型。
  • 當(dāng)一側(cè)為 Number 類(lèi)型,另一側(cè)為引用類(lèi)型,將引用類(lèi)型和 Number 類(lèi)型轉(zhuǎn)換成字符串后拼接。
  • 只有 null undefined '' NaN 0 false 這幾個(gè)是 false,其他的情況都是 true,比如 {} , []。

以上就是js類(lèi)型判斷內(nèi)部實(shí)現(xiàn)原理示例詳解的詳細(xì)內(nèi)容,更多關(guān)于js類(lèi)型判斷內(nèi)部原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

沙田区| 衡东县| 新巴尔虎右旗| 资源县| 西丰县| 新邵县| 靖宇县| 北票市| 栖霞市| 盐亭县| 自贡市| 开江县| 金山区| 绥江县| 阳曲县| 灵川县| 长岭县| 米脂县| 兰溪市| 营口市| 新乐市| 文昌市| 台东县| 辛集市| 固始县| 公主岭市| 宜春市| 汉沽区| 赣州市| 津市市| 峨眉山市| 高阳县| 九龙县| 顺平县| 车致| 湘乡市| 凤冈县| 利辛县| 武城县| 南溪县| 陇西县|