类型转换

类型转换是指将数据由一种类型变换为另一种类型。在编译器自动赋值时,会发生隐式转换,但在代码中,也可以用一些写法强制要求进行显式转换。例如:在表达式 5 + 2.0 中,整数 5 被隐式转换为浮点数,但 Number("0x11") 和 "0x11" 则被显式转换为数字 17。

转Boolean

条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。

转对象

对象在转换基本类型时,首先会调用 valueOf 然后调用 toString

  • valueOf: 返回指定对象的原始值。
  • toString: 返回一个表示该对象的字符串
// Number
var num =  15.26540;
num.valueOf()   // 15.2654
num.toString()  // "15.2654"
1 + num // 16.2654
"1" + num // 115.2654


// Array
var array = ["ABC", true, 12, -5];
array.valueOf()   // (4) ["ABC", true, 12, -5]
array.toString()  // "ABC,true,12,-5"
1 + array // "1ABC,true,12,-5"
array + array   //"ABC,true,12,-5ABC,true,12,-5"  注意这里是字符串,而不是数组

// 布尔值
var bool = true;
bool.valueOf()   // true
bool.toString()   // "true"
1 + bool // 2
bool + bool // 2
"1" + bool // "1true"
// 若布尔值为 false ,转为 number 时的值为 0
var bool = false;
1 + bool // 1
bool + bool // 0


// Function
function foo(){}
foo.valueOf()   // ƒ foo(){}
var foo2 =  new Function("x", "y", "return x + y;");
foo2.valueOf()
/*
ƒ anonymous(x,y
) {
return x + y;
}
*/

// Object
var obj = {name: "张三", age: 18};
obj.valueOf()   // {name: "张三", age: 18}
obj.toString()  // "[object Object]"
1 + obj //  "1[object Object]"
obj + obj //    "[object Object][object Object]"

注意:字符串上下文中的对象通过 toString()方法转换,这与使用valueOf转换为原始字符串的String对象不同。所有对象都能转换成一个“[object 类型]”这种格式的字符串。但是很多对象不能转换为数字,布尔或函数。

重写valueOf()toSting

let a = {
  valueOf() {
    return 0;
  },
  toString() {
    return 'a';
  },
}
1 + a // => 1
'1' + a // => '10'

也可以重写 Symbol.toPrimitive ,该方法在转基本类型时调用优先级最高

const obj = {
    valueOf() {
        return 0;
    },
    [Symbol.toPrimitive](hint) {
    if (hint == 'number') {
      return 42;
    }else if(hint == 'string'){
        return "hello";
    }
    return true;
  }
};

console.log(+obj2);     // 42      -- hint 参数值是 "number"
console.log(`${obj2}`); // "hello" -- hint 参数值是 "string"
console.log(obj2 + ""); // "true"  -- hint 参数值是 "default"

四则运算符

  • 加法运算时:一方是字符串类型,就会把另一个也转为字符串类型。并且加法运算会触发三种类型转换:将值转换为原始值,转换为数字,转换为字符串。
  • 其他运算符:一方是数字,那么另一方就转为数字。
    若为字符串会转换为数字,转换失败结果会为NaN
// 一方为数字
1 + '1' // '11'
2 * '2' // 4
4 / '2' // 2

// 都不为数字
'4' / '2' // 2
'2a' * '2' // NaN
['a', 'b'] + ['c', 'd'] // '"a,bc,d",此次为字符串拼接

// 特殊
'a' + + 'b' // -> "aNaN"
// 因为 + '1' -> 1
// + 'b' -> NaN

相等性判断

JavaScript提供三种不同的值比较操作:

  • 严格相等 ,类型和值都相等,使用 ===
  • 宽松相等 ,值相等,使用 ==
  • Object.is (ES6 新特性, 确定两个值是否相同。)

一般而言,所有的对象都与 undefinednull 不相等。但是大部分浏览器允许非常窄的一类对象(即,所有页面中的 document.all 对象),在某些情况下,充当效仿 undefined 的角色。

判断x==y,其中xy都是值

  1. xy类型相等

    1. x类型为Null,返回true
    2. x类型为Undefined,返回true
    3. x类型为Number,则
      1. xNaN,返回false
      2. yNaN,返回false
      3. x+0y-0,返回true
      4. x-0y+0,返回true
      5. xy数值相等,返回true
      6. 返回 false
    4. x类型为String,若xy为完全相同的字符序列,返回true.否则,返回false
    5. x类型为Boolean,同为true或者false时返回true.否则,返回false
      6.同为引用同一对象时返回true.否则,返回false
  2. xnull且y为undefined, 返回true

  3. xundefined且y为null, 返回true

  4. Type(x)Number且Type(y)String,返回comparison x == ToNumber(y)的结果。

  5. Type(x)StringType(y)Number,.返回比较ToNumber(x) == y的结果。

  6. Type(x)Boolean, 返回比较ToNumber(x) == y的结果。

  7. 若Type(y)为Boolean,返回比较x == ToNumber(y)的结果。

  8. Type(x)StringNumber, 且Type(y)Object, 返回比较x == ToPrimitive(y)的结果。

  9. Type(x)为Object且Type(y)StringNumber, 返回比较ToPrimitive(x) == y的结果。返回false

1 == '1' // true
null = undefined // true
null = document.all // true
undefined = document.all // true

现在来解析一道题目 [] == ![] // -> true ,下面是这个表达式为何为 true 的步骤

// [] 转成 true,然后取反变成 false
[] == false
// 根据第 8 条得出
[] == ToNumber(false)
[] == 0
// 根据第 10 条得出
ToPrimitive([]) == 0
// [].toString() -> ''
'' == 0
// 根据第 6 条得出
0 == 0 // -> true

总结:[] == ! [] -> [] == false -> [] == 0 -> '' == 0 -> 0 == 0 -> true

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容