什么是二义性?

字面理解是具有两个含义的意思

什么是运算符的二义性?

运算符的二义性是指这个运算符代表的运算方式不是唯一的, 有多重意思。

字符串链接

var string = "hello" + "world";

运算

var number1 = 10;
var number2 = 20;
var sum = number1 + number2; // sum = 30;

为什么一个运算符会有多种含义呢?

是因为 Javascript 中的运算处理是依赖于数据类型。

字符串的优先权

如果表达式中存在字符串,则优先按字符串连接进行运算

var a = "10";
var b = 10;
a + b = "1010";
b + a = "1010";
//这里并没有按我们期望的结果运行,
//Javascript 在解析这个运算的时候当作了两个字符串的拼接

+字符将字符串转换成数字

此技巧只实用与字符串的数字

var a = "10";
a = +a; // 10

var b = "10a";
b = +b; // NaN

上面使用 + 可以将一个数字字符串转换为整形是因为 + 含有 "正值运算符" 的含义

连续运算

在声明多个变量的时候可以使用 , 符号做分割, 同事定义几个变量。

var a = 1, b = 2, c = 3;

var a = 1, 2 ,3; // Unexpected
//连续运算变做连续声明运算, 2  3 无法指定对象接收, 会报意外异常

var a;
a = 1, 2 ,3; // a = 1;
//表达式 " 1, 2 ,3 " 返回的结果为 3 , 但是赋值运算只有第一个值有效。

var a;
a = (1, 2 ,3); // a = 3;
//与上面同理, " () " 会先接收返回值, 表达式依次返回 1,2,3 后面的覆盖前面的
//所以 a = 3

方括号

方括号具有取值和数组直接量声明的作用
var array = [];   // 直接声明一个数组对象
array[0] = 1;     // 赋值
var tmp = array[0]; //取值
var array = ["a",1,"2"];  // "," 为分隔符, 可以连续声明多个值
var array = ["a","1","b","c"][1,2,3] // array = "c";
/*
    分解:
        array = ["a","1","b","c"];
        array = array[3]; // 这里取的是数组最后一个元素 [1,2,3]  3
        array = "c";
*/