摘要:一個(gè)小測試試試結(jié)論當(dāng)操作需要一個(gè)字符串時(shí)當(dāng)操作需要一個(gè)數(shù)字時(shí)當(dāng)運(yùn)算符不確定時(shí)如果存在就直接調(diào)用如果是先調(diào)用沒有再調(diào)用如果是先調(diào)用沒有再調(diào)用如果是按照處理其它按照處理如果或者返回的不是原始類型則忽略該調(diào)用轉(zhuǎn)向下一個(gè)調(diào)用如果沒有下一個(gè)調(diào)用則報(bào)
一個(gè)小測試, 試試:
let o = { valueOf() { return 0; }, }; console.log(+o); // 0 console.log(1 + o); // 1 console.log(1 - o); // 1 console.log("" + o); // "0" console.log(`${o}`); // "[object Object]"結(jié)論
當(dāng)操作需要一個(gè)字符串時(shí), hint=string, 當(dāng)操作需要一個(gè)數(shù)字時(shí), hint=number, 當(dāng)運(yùn)算符不確定時(shí)hint=default.
如果存在 obj[Symbol.toPrimitive](hint), 就直接調(diào)用
如果 hint 是 string, 先調(diào)用 obj.toString(), 沒有再調(diào)用 obj.valueOf()
如果 hint 是 number, 先調(diào)用 obj.valueOf(), 沒有再調(diào)用obj.toString()
如果 hint 是 default, Date 按照 hint=string處理, 其它按照 hint=number 處理
如果 toString 或者 valueOf 返回的不是原始類型, 則忽略該調(diào)用, 轉(zhuǎn)向下一個(gè)調(diào)用, 如果沒有下一個(gè)調(diào)用, 則報(bào)錯(cuò), 但是 toPrimitive 必須返回原始類型, 否則報(bào)錯(cuò)
詳解 根據(jù)上下文, 會有以下轉(zhuǎn)換 hint string當(dāng)操作需要一個(gè)字符串時(shí), 對象轉(zhuǎn)換的 hint 為 string.
// alert(參數(shù)是字符串) alert(obj); confirm(obj); // 對象的屬性是字符串 anotherObj[obj] = 123;number
當(dāng)操作需要一個(gè)數(shù)字時(shí), 對象轉(zhuǎn)換的 hint 為 number.
// 明確轉(zhuǎn)換成數(shù)字 Number(obj); // 轉(zhuǎn)換成數(shù)字(非加法) +obj; // 數(shù)學(xué)運(yùn)算(加法除外) 1 - obj; 1 * obj; 1 / obj;
因?yàn)闅v史原因大小比較的 hint 也是 number
// hint 為 number obj1 > obj2;default
當(dāng)運(yùn)算符不確定時(shí), 對象轉(zhuǎn)換的 hint 為 default.
// 比如加法, 可以是數(shù)字相加, 也可以是字符串相加 1 + obj; "1" + obj; // == 弱相等比較 // obj == string/number/symbol obj == "1"; obj == 1;
通常, 內(nèi)置對象(除了 Date 外), default 轉(zhuǎn)換 和 number 轉(zhuǎn)換是相同的
Date 的 default 轉(zhuǎn)換 和 string 相同 [Date.prototype[@@toPrimitive]](https://developer.mozilla.org...
如果存在 obj[Symbol.toPrimitive](hint), 就直接調(diào)用
如果 hint 是 string, 先調(diào)用 obj.toString(), 沒有再調(diào)用 obj.valueOf()
如果 hint 是 number, 先抵用 obj.valueOf(), 沒有再調(diào)用obj.toString()
example Symbol.toPrimitivetype primitiveType = null | undefined | number | boolean | string | symbol; type hintType = "string" | "number" | "default"; obj[Symbol.toPrimitive] = function(hint: hintType): primitiveType { console.log(`hint is: ${hint}`); return hint == "string" ? "一個(gè)字符串" : 0; };toString / valueOf
let user = { name: "John", money: 1000, // for hint="string" toString(): string { return `{name: "${this.name}"}`; }, // for hint="number" or "default" valueOf(): number { return this.money; }, }; alert(user); // toString -> {name: "John"} alert(+user); // valueOf -> 1000 alert(user + 500); // valueOf -> 1500
let obj = { toString() { return "2"; }, }; // 加法, 調(diào)用 `default` hint, `default` 和 `number` 轉(zhuǎn)換相同, // 先調(diào)用 valueOf 方法, 因?yàn)椴淮嬖? 所以調(diào)用 toString 方法, 返回 "2" // "2" + 2 = "22" alert(obj + 2); // "22" // 存在 valueOf, 所以 2+2 = 4 let obj = { toString() { return "2"; }, valueOf() { return 2; }, }; alert(obj + 2); // 4
let d = new Date(); let d2 = d.getTime() - 1; // 加法, 調(diào)用 `default` hint, Date 的 `default` 和 `string` 相同 alert(1 + d); // 1Fri Feb 15 2019 20:59:00 GMT+0800 (China Standard Time) // 減法, 調(diào)用 `number` hint alert(d - d2); // 1參考文檔
https://javascript.info/object-toprimitive
[Date.prototype[@@toPrimitive]](https://developer.mozilla.org...
文章若有紕漏請大家補(bǔ)充指正,謝謝~~
http://blog.xinshangshangxin.com SHANG 殤
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101730.html
摘要:大括號的作用,在不同的上下文中差別很大以下觀點(diǎn)若有錯(cuò)誤,請前輩及時(shí)指出一被當(dāng)做對象字面量如,外層的被賦值給了,這里的被當(dāng)做對象處理。本文參考你不知道的 大括號‘{ }’的作用,在不同的上下文中差別很大!以下觀點(diǎn)若有錯(cuò)誤,請前輩及時(shí)指出! 一、{ }被當(dāng)做對象字面量 如:var obj = { foo: function(){} };,外層的{...}被賦值給了obj,這里的{...}被...
摘要:運(yùn)行規(guī)則根據(jù)的運(yùn)作原理,我們可以看到,的值和調(diào)用棧通過哪些函數(shù)的調(diào)用運(yùn)行到調(diào)用當(dāng)前函數(shù)的過程以及如何被調(diào)用有關(guān)。 1. this的誕生 假設(shè)我們有一個(gè)speak函數(shù),通過this的運(yùn)行機(jī)制,當(dāng)使用不同的方法調(diào)用它時(shí),我們可以靈活的輸出不同的name。 var me = {name: me}; function speak() { console.log(this.name); }...
摘要:中常常會看到這種代碼變量與的比較這種用法很有問題用來判斷變量是否被賦予了一個(gè)合理的值比如不好的寫法執(zhí)行一些邏輯這段代碼中方法顯然是希望是一個(gè)數(shù)組因?yàn)槲覀兛吹降膿碛泻瓦@段代碼的意圖非常明顯如果參數(shù)不是一個(gè)數(shù)組則停止接下來的操作這種寫法的問題在 js中, 常常會看到這種代碼: 變量與null的比較(這種用法很有問題), 用來判斷變量是否被賦予了一個(gè)合理的值. 比如: const Contr...
摘要:第二篇仿寫生態(tài)系列模板小故事本次任務(wù)承上完成第一篇未完成的熱更新配置核心完成模板解析模塊的相關(guān)編寫很多文章對模板的解析闡述的都太淺了本次我們一起來深入討論一下盡可能多的識別用戶的語句啟下在結(jié)構(gòu)上為雙向綁定等模塊的編寫打基礎(chǔ)最終效果圖一模板頁 ( 第二篇 )仿寫Vue生態(tài)系列___模板小故事. 本次任務(wù) 承上: 完成第一篇未完成的熱更新配置. 核心: 完成模板解析模塊的相關(guān)編寫, ...
摘要:第二篇仿寫生態(tài)系列模板小故事本次任務(wù)承上完成第一篇未完成的熱更新配置核心完成模板解析模塊的相關(guān)編寫很多文章對模板的解析闡述的都太淺了本次我們一起來深入討論一下盡可能多的識別用戶的語句啟下在結(jié)構(gòu)上為雙向綁定等模塊的編寫打基礎(chǔ)最終效果圖一模板頁 ( 第二篇 )仿寫Vue生態(tài)系列___模板小故事. 本次任務(wù) 承上: 完成第一篇未完成的熱更新配置. 核心: 完成模板解析模塊的相關(guān)編寫, ...
閱讀 3762·2021-09-22 15:17
閱讀 1946·2021-09-22 14:59
閱讀 2346·2020-12-03 17:00
閱讀 3209·2019-08-30 15:55
閱讀 482·2019-08-30 11:23
閱讀 3487·2019-08-29 13:56
閱讀 518·2019-08-29 12:54
閱讀 2257·2019-08-29 12:49