鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 一小段js引來的問題

一小段js引來的問題

var x = 1;
var obj = {
  valueOf: function() {
    x = 2;
    return 0;
  }
};
console.log(x); //1
console.log(obj.valueOf()); //0
console.log(obj); //Object
console.log(obj == 0,x); // true 2

1問:為什么都是輸出x,兩者值不同?
2問:obj出來的是個(gè)Object,為什么和0比較會true?
3問:接上問,出現(xiàn)true,是因?yàn)?=的類型轉(zhuǎn)換嗎?那我把obj里的valueOf改成其它對象名,為什么就變成false了(如下)?

var x = 1;
var obj = {
  asd: function() {
    x = 2;
    return 0;
  }
};
console.log(x); //1
console.log(obj.asd()); //0
console.log(obj); //Object
console.log(obj == 0,x); // false 2
回答
編輯回答
柒喵
  1. 執(zhí)行valueOf的時(shí)候,里面的x = 2把外部的x值給改了。
  2. 類型不同做比較的過程中調(diào)用了valueOf,而你給當(dāng)前對象添加了valueOf,就不會調(diào)用原型鏈上的valueOf了,所以拿到了0。這個(gè)可以搜下相等比較的相關(guān)問題。
  3. 同2。

相等比較的東西僅供參考,因?yàn)槲矣洸磺辶?,可能有錯誤。

var a = {}
a.valueOf = function () {console.log('valueOf');return 1}
a.toString = function () {console.log('toString')}
a == 1
// 可看到打印出了
// valueOf
// 如果將valueOf方法改為
a.valueOf = function () {console.log('valueOf');return a}
// 即返回一個(gè)非基本數(shù)據(jù)類型,會看到
// valueOf
// toString

也就是會先調(diào)用valueOf,如果拿到的不是基本數(shù)據(jù)類型(這一點(diǎn)不太確定)還會再調(diào)用toString
好像Date類型的數(shù)據(jù)調(diào)用的順序也不一樣,你再自己查查相等判斷的規(guī)則吧。

2018年9月13日 01:02
編輯回答
失心人

https://developer.mozilla.org...
第三個(gè)問題
valueOf 當(dāng)對象調(diào)用的時(shí)候默認(rèn)返回本身,你這里相當(dāng)于重寫了valueOf方法

2018年4月9日 12:48
編輯回答
厭遇

js在做比較的時(shí)候會調(diào)用對象的valueOf函數(shù),第一種寫法相當(dāng)于你把valueOf函數(shù)重寫了,所以執(zhí)行obj==0的時(shí)候?qū)嶋H上是執(zhí)行的 0==0,返回true
第二種寫法在比較的時(shí)候會直接調(diào)用原型鏈的valueOf,此時(shí)的asd函數(shù)是沒用的,樓主可以試一下一個(gè)對象的valueOf返回的結(jié)果是什么。這個(gè)時(shí)候返回的是false
另外,樓主可以試一下第一種寫法的valueOf最后改成return 1,再測試一下結(jié)果就明白了

2017年1月18日 11:43
編輯回答
吃藕丑

其實(shí)很簡單,第一個(gè)寫法obj==0返回true就是因?yàn)閖s在比較的時(shí)候調(diào)用了valueOf函數(shù),而你的obj里面有valueOf函數(shù)所以js直接執(zhí)行的是obj本身的valueOf而非原型鏈上的valueOf,所以才返回的true。

2017年10月11日 05:41