电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

js類型判斷內部實現原理示例詳解

瀏覽:2日期:2022-06-12 16:59:45
目錄typeofinstanceof 的內部實現原理Object.prototype.toString()[[class]]總結typeof

typeof 操作符唯一的目的就是檢查數據類型

類型typeof 結果基本類型undefinedundefinedBooleanbooleanNumbernumberStringstringSymbolsymbolBigIntbigintnullobject引用類型Object(Object, Array, Map, Set, Regexp, Date 等)objectFunctionfunction

你會發現用typeof來判斷引用類型時, 都會返回 'object'. 為此, 引入了 instanceof

instanceof 運算符用于檢測構造函數的 prototype 屬性是否出現在某個實例對象的原型鏈上。

var arr = [];arr instanceof Array; // truetypeof arr; // 'object'function A() {}function B() {}// Javascript 繼承B.prototype = new A();var b = new B();b instanceof A; // trueb instanceof B; // trueinstanceof 的內部實現原理思路:

利用 原型和原型鏈, 每一個函數都有一個顯式的 prototype, 每一個對象都有一個隱式原型 **proto**, 當我們對象的原型鏈中存在構造函數的顯式原型 prototype時, 我們就可以確定它們之間存在關系;

function myInstanceOf(constructor, instance) { let prototype = constructor.prototype; let proto = instance.__proto__; while (true) { // 說明道原型鏈訂單, 還未找到, 返回 false if (proto === null) { return false; } if (proto === prototype) { return true; } // 繼續向 proto 的原型鏈上遍歷 proto = Object.getPrototypeOf(proto); }}Object.prototype.toString()toString() 方法返回一個表示該對象的字符串。該方法旨在重寫(自定義)派生類對象的類型轉換的邏輯。valueOf() 方法返回對象的原始值表示

該方法由 字符串轉換優先調用, 但是 數字的強制轉換和原始值的強制轉換 會優先調用 valueOf, 因為基本的 valueOf() 方法返回一個對象,toString() 方法通常在結束時調用

默認情況下(不重寫 toString方法), 任何一個對象調用 Object原生的 toString方法, 都會返回一個 [object type], 其中 type是對象的類型

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

每個 實例 都有一個 [[Class]] 屬性,這個屬性中就指定了上述字符串中的 type 。 [[Class]] 不能直接地被訪問,但通常可以通過 Object.prototype.toString.call(..) 方法調用來展示。

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

所以可以通過這個方法來判斷每個對象的類型

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([])); // trueisDate(new Date()); // trueisRegExp(/\w/); // trueisFunction(function(){}); //true

以下是一道簡單的面試題

+[1 + [2] + 3] + [1 + 2 + true - false] + [[3 - false + '1']];// 拆分一下let a = +[1 + [2] + 3];// [2]會首先進行轉換 [2].valueOf, 結果不是基本類型, [2]在調用toString(), 返回'2', 最后 1 + '2' + 3, 1,3進行隱式轉換, +'123' ==> 123let b = [1 + 2 + true - false];// [3+true-false], true, false會進行轉換, true=>1, false=>0, 最后1-0==>[1+3]==>[4]==>[4].valueOf().toString()==>'4'let c = [[3 - false + '1']];// 先轉換數組里面的一層, [3-0+'1']==>['31'], 結果: [['31']]==>[['31']].valueOf().toString()==>'31'// 最后 a+b+c// 123+'4'+'31'==>123431

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

思路:

重寫 a 的 valueOf 方法

let a = { value: [3, 2, 1], valueOf: function () { return this.value.pop(); },};總結當一側為 String 類型,被識別為字符串拼接,并會優先將另一側轉換為字符串類型。當一側為 Number 類型,另一側為原始類型,則將原始類型轉換為 Number 類型。當一側為 Number 類型,另一側為引用類型,將引用類型和 Number 類型轉換成字符串后拼接。只有 null undefined '' NaN 0 false 這幾個是 false,其他的情況都是 true,比如 {} , []。

以上就是js類型判斷內部實現原理示例詳解的詳細內容,更多關于js類型判斷內部原理的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
主站蜘蛛池模板: 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 走心机厂家,数控走心机-台州博城智能科技有限公司 | 高铝轻质保温砖_刚玉莫来石砖厂家_轻质耐火砖价格 | 烟气换热器_GGH烟气换热器_空气预热器_高温气气换热器-青岛康景辉 | 锯边机,自动锯边机,双面涂胶机-建业顺达机械有限公司 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 物流公司电话|附近物流公司电话上门取货 | 能耗监测系统-节能监测系统-能源管理系统-三水智能化 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 合肥办公室装修 - 合肥工装公司 - 天思装饰| 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 | 聚合甘油__盐城市飞龙油脂有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | 扬州汇丰仪表有限公司 | 陶瓷加热器,履带式加热器-吴江市兴达电热设备厂 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 培训中心-翰香原香酥板栗饼加盟店总部-正宗板栗酥饼技术 | 爱德华真空泵油/罗茨泵维修,爱发科-比其尔产品供应东莞/杭州/上海等全国各地 | 消电检公司,消电检价格,北京消电检报告-北京设施检测公司-亿杰(北京)消防工程有限公司 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 沈阳庭院景观设计_私家花园_别墅庭院设计_阳台楼顶花园设计施工公司-【沈阳现代时园艺景观工程有限公司】 | 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 科普仪器菏泽市教育教学仪器总厂 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 物和码官网,物和码,免费一物一码数字化营销SaaS平台 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | 船用泵,船用离心泵,船用喷射泵,泰州隆华船舶设备有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 |