我被javascript红宝书5.2.2转换方法里的一段例子卡住了

吴先森
  • 68

红宝书,5.2.2 转换方法

toLocaleString()方法经常也会返回与toString()valueOf()方法相同的值,但也不总是如此。当调用数组的toLocaleString()方法时,它也会创建一个数组值的以逗号分隔的字符串。而与前两个方法唯一的不同之处在于,这一次为了取得每一项的值,调用的是每一项的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这个数组传递给alert( ),输出的结果是NicholasGreg?
2、person1person2这两个对象,它们分别定义了toString()toLocaleString( )方法,这两个方法返回不同的值。但这两个对象里自定义的方法和后来调用的alert(people.toString())alert(people.toLocaleString())不冲突么?

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

3、上面的结果,到底是因为对象自定义的两个方法得来的,还是直接通过调用得来的?可以简单的告诉我一下这个过程是什么样的么?

回复
阅读 1.5k
4 个回答

alert(people) === alert(people.toString())
alert里面的参数期望的是一个字符串,所以会自动调用toString方法
而toString和toLocalString的区别就像是两个函数区别,之间没有任何联系
关于数组为何其toString和toLocalString和普通对象不同,主要是数组重写了这两个方法

讨论一下第3个问题:
先来看一下你在提问开头关于红宝书内容的引用:

...而与前两个方法唯一的不同之处在于,这一次为了取得每一项的值,调用的是每一项toLocaleString()方法...

也就是说

people.toLocaleString();
//等价于
people.forEach(item=>item.toLocaleString());
  1. 隐式强制类型转换,会先调用valueOf再调用toString
  2. 没有所谓的冲突,属性访问时,如果对象在本身查找不到一个属性doSomething,才会查找原型链上是否有这个属性,直到查到Object的原型链中还没有则返回undefined
  3. 同2

其他(这才是我想说的)

toLocaleString()方法经常也会返回与toString()和valueOf()方法相同的值
  1. toLocaleString一般不会返回和valueOf相同的值,类型就不一样。
  2. toLocalString的设计目的是返回一个特定语言环境的字符串,因此Array中会对每个子对象做toLocalString处理。
lumos
  • 4
新手上路,请多包涵

说实话 我也没看懂这个例子 搜索过来的,我觉得楼上的回答还是很牵强,有没有可以详细解释一哈的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏