鍍金池/ 問答/網(wǎng)絡安全  HTML/ 我被javascript紅寶書5.2.2轉(zhuǎn)換方法里的一段例子卡住了

我被javascript紅寶書5.2.2轉(zhuǎn)換方法里的一段例子卡住了

紅寶書,5.2.2 轉(zhuǎn)換方法

toLocaleString()方法經(jīng)常也會返回與toString()valueOf()方法相同的值,但也不總是如此。當調(diào)用數(shù)組的toLocaleString()方法時,它也會創(chuàng)建一個數(shù)組值的以逗號分隔的字符串。而與前兩個方法唯一的不同之處在于,這一次為了取得每一項的值,調(diào)用的是每一項的toLocaleString()方法,而不是toString()方法,請看下面這個例子:

大神們,我就直接上代碼了:

var person1 = {
    toLocaleString : function () {
        return "Nikolaos";
    },
    toString : function() {
        return "Nicholas";
    } 
};

var person2 = {
    toLocaleString : function () {
        return "Grigorios";
    },
    toString : function() {
        return "Greg";
    } 
};

var people = [person1, person2];
alert(people);                        //Nicholas,Greg
alert(people.toString());             //Nicholas,Greg
alert(people.toLocaleString());       //Nikolaos,Grigorios

其實對這一章的陳述和代碼,表示很多地方弄不清楚:
1?alert(people)為什么將people這個數(shù)組傳遞給alert( ),輸出的結(jié)果是NicholasGreg?
2、person1person2這兩個對象,它們分別定義了toString()toLocaleString( )方法,這兩個方法返回不同的值。但這兩個對象里自定義的方法和后來調(diào)用的alert(people.toString())alert(people.toLocaleString())不沖突么?

alert(people.toString());             //Nicholas,Greg
alert(people.toLocaleString());       //Nikolaos,Grigorios

3?上面的結(jié)果,到底是因為對象自定義的兩個方法得來的,還是直接通過調(diào)用得來的?可以簡單的告訴我一下這個過程是什么樣的么?

回答
編輯回答
別傷我
  1. 隱式強制類型轉(zhuǎn)換,會先調(diào)用valueOf再調(diào)用toString
  2. 沒有所謂的沖突,屬性訪問時,如果對象在本身查找不到一個屬性doSomething,才會查找原型鏈上是否有這個屬性,直到查到Object的原型鏈中還沒有則返回undefined
  3. 同2

其他(這才是我想說的)

toLocaleString()方法經(jīng)常也會返回與toString()和valueOf()方法相同的值
  1. toLocaleString一般不會返回和valueOf相同的值,類型就不一樣。
  2. toLocalString的設計目的是返回一個特定語言環(huán)境的字符串,因此Array中會對每個子對象做toLocalString處理。
2017年12月30日 12:11
編輯回答
舊言

alert(people) === alert(people.toString())
alert里面的參數(shù)期望的是一個字符串,所以會自動調(diào)用toString方法
而toString和toLocalString的區(qū)別就像是兩個函數(shù)區(qū)別,之間沒有任何聯(lián)系
關于數(shù)組為何其toString和toLocalString和普通對象不同,主要是數(shù)組重寫了這兩個方法

2018年1月31日 03:37
編輯回答
六扇門

討論一下第3個問題:
先來看一下你在提問開頭關于紅寶書內(nèi)容的引用:

...而與前兩個方法唯一的不同之處在于,這一次為了取得每一項的值,調(diào)用的是每一項toLocaleString()方法...

也就是說

people.toLocaleString();
//等價于
people.forEach(item=>item.toLocaleString());
2017年10月1日 14:30
編輯回答
別逞強

說實話 我也沒看懂這個例子 搜索過來的,我覺得樓上的回答還是很牽強,有沒有可以詳細解釋一哈的

2017年7月28日 03:00