在网上或面试题中经常会看到一些“奇怪”的语句,比如
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
在Javascript中
运算符是个重载运算符,可用来拼接字符串,以及把两个“数字”相加。至于是哪种情况要看运算符两边参数的类型。
在日常的开发中我们也不会碰到这么麻烦的事,但弄弄清楚总是好的。在规范 中巴拉巴拉地说了一堆,简单来说就是:
1. 对于原生类型,参数中只要有一方是字符串,则按字符串连接处理,否则按数字相加处理,不是数字的会先转成数字再相加。
原生类型有:undefined, null, boolean, number, string。
下面是一些示例:
立即学习
“
Java免费学习笔记(深入)
”;
2. 对于引用类型,则需要先转换成原生类型,再按以上规则相加。如何转换在规范中有详细的说明,但规范看起来是有点费劲。 简单来说就是:默认情况下都转化成字符串,要搞特殊的话,请重写
方法。
来个例子:
但由于Js不支持真正的操作符重载,即不能相加得到自定义类型的对象, 所以以上示例在实践代码中非常少用。
不过目前的知识足够回答原先的问题了。但是慢着,
为什么和
不一样? 这其实是个语法问题。前者相当于:
其实是两个句子,
转换成数字是 0。很容易验证
有人可能要问,那
的
不是转换成数字吗?为什么相加结果还是字符串类型呢?
这是Date类做了特殊处理, @@toPrimitive, 默认情况下对
的相加以字符串方式连接,但比较时则会转换成数字。
将引用类型转换成原生类型在很多操作符中都有用到,比如
,
, 所以有必要对其研究一番, 以下js代码大概描述了其行为。
详细的请参考规范
在网上或面试题中经常会看到一些“奇怪”的语句,比如
在Javascript中
运算符是个重载运算符,可用来拼接字符串,以及把两个“数字”相加。至于是哪种情况要看运算符两边参数的类型。
在日常的开发中我们也不会碰到这么麻烦的事,但弄弄清楚总是好的。在规范 中巴拉巴拉地说了一堆,简单来说就是:
1. 对于原生类型,参数中只要有一方是字符串,则按字符串连接处理,否则按数字相加处理,不是数字的会先转成数字再相加。
原生类型有:undefined, null, boolean, number, string。
下面是一些示例:
立即学习
“
Java免费学习笔记(深入)
”;
2. 对于引用类型,则需要先转换成原生类型,再按以上规则相加。如何转换在规范中有详细的说明,但规范看起来是有点费劲。 简单来说就是:默认情况下都转化成字符串,要搞特殊的话,请重写
方法。
来个例子:
但由于Js不支持真正的操作符重载,即不能相加得到自定义类型的对象, 所以以上示例在实践代码中非常少用。
不过目前的知识足够回答原先的问题了。但是慢着,
为什么和
不一样? 这其实是个语法问题。前者相当于:
其实是两个句子,
转换成数字是 0。很容易验证
有人可能要问,那
的
不是转换成数字吗?为什么相加结果还是字符串类型呢?
这是Date类做了特殊处理, @@toPrimitive, 默认情况下对
的相加以字符串方式连接,但比较时则会转换成数字。
将引用类型转换成原生类型在很多操作符中都有用到,比如
,
, 所以有必要对其研究一番, 以下js代码大概描述了其行为。
{}+{}
// "[object Object][object Object]"
{}+[]
// 0
[]+{}
// "[object Object]"
[]+[]
// ""+0 + '1' // '01'
null + 1 // 1
true + 1 // 2
false + 1 // 0
undefined + 2 // NaN, 因为undefined转成Number是NaNvalueOf()function Complex(a, b) {
this.a = a;
this.b = b;
}
Complex.prototype.valueOf() {
return this.a;
}
new Complex(2, 3) + new Complex(4, 5);
// 6{}+[][]+{}{}
+[][]({}+[]) === '[object Object]'+[] // 0new Date()valueOf()new Date().valueOf();
// 1491904757087
1 + new Date();
// "1Tue Apr 11 2017 18:02:16 GMT+0800 (CST)"Datenew Date() < new Date('2018-01-01')
// true, 现在是2017<>/**
* @param input 即要转换的对象
* @preferredType 期望转换成的类型,可以是string或number
*/
function ToPrimitive(input, preferredType) {
if (typeof input !== 'object') {
return input; // 本来就是原生类型
}
var hint = preferredType || 'default';
if (typeof input['@@toPrimitive'] === 'function') { // @@toPrimitive是个内部方法,这里只是示例说明其工作原理
return input['@@toPrimitive'](input, hint); // 这就是为什么Date能特殊处理的原因
}
if (hint === 'string') {
return input.toString();
}
return input.valueOf();
}{}+{}
// "[object Object][object Object]"
{}+[]
// 0
[]+{}
// "[object Object]"
[]+[]
// ""+0 + '1' // '01'
null + 1 // 1
true + 1 // 2
false + 1 // 0
undefined + 2 // NaN, 因为undefined转成Number是NaNvalueOf()function Complex(a, b) {
this.a = a;
this.b = b;
}
Complex.prototype.valueOf() {
return this.a;
}
new Complex(2, 3) + new Complex(4, 5);
// 6{}+[][]+{}{}
+[][]({}+[]) === '[object Object]'+[] // 0new Date()valueOf()new Date().valueOf();
// 1491904757087
1 + new Date();
// "1Tue Apr 11 2017 18:02:16 GMT+0800 (CST)"Datenew Date() < new Date('2018-01-01')
// true, 现在是2017<>/**
* @param input 即要转换的对象
* @preferredType 期望转换成的类型,可以是string或number
*/
function ToPrimitive(input, preferredType) {
if (typeof input !== 'object') {
return input; // 本来就是原生类型
}
var hint = preferredType || 'default';
if (typeof input['@@toPrimitive'] === 'function') { // @@toPrimitive是个内部方法,这里只是示例说明其工作原理
return input['@@toPrimitive'](input, hint); // 这就是为什么Date能特殊处理的原因
}
if (hint === 'string') {
return input.toString();
}
return input.valueOf();
}