类型与语法
第一章--类型
一句话总结
值有类型,类型为分类使用而生。
思考
本身“类型”的出现在于分类。在于区分事物的区别,程序语言的类型的出现在于,程序引擎和开发者在对待42(数字)不同于他们对待“42”(字符串)时,会采用不同的方式,那么这两个值的类型就应当不同,在JavaScript中就是number类型和string类型。
我之前在大一做Java课设期间,舍友曾经问我一个问题:为什么你的程序中的学号字段的类型定义的是String而不是Int这样的数字类型(大意)?学号的“数字感”,总让人第一时间就想到数字类型。后来我是这样解释的,学号不像是“数值”而更多的是一种“标识”,犹如车牌号,各种楼层号。数值的主要作用是用来计算,即加减乘除。学号顶多涉及到一个排序。
开发者对待类型不同,自然让引擎也应对待的不同。
可是JavaScript这种弱类型也一样吗?
基础
JavaScript定义了7种内置类型:
- null
- undefined
- boolean
- number
- string
- object
- symbol -- added in ES6!
7种类型对应着7种typeof的返回方式,然而并不是一一对应的
typeof undefined === "undefined"; // true
typeof true === "boolean"; // true
typeof 42 === "number"; // true
typeof "42" === "string"; // true
typeof { life: 42 } === "object"; // true
// added in ES6!
typeof Symbol() === "symbol"; // true
typeof null === "object"; // true
// typeof返回的第七个字符串
typeof function a(){ /* .. */ } === "function"; // true
在JavaScript中,变量没有类型,值才有类型。
变量可以在任何时间保存任何类型的值。
这似乎很好理解,但是又很难说出和其他强类型语言的区别,
“类型强制访问控制(type enforcement),表现在引擎冰不要求一个变量始终保持它的初始化值的类型。变量可以在一个赋值语句中保持string类型的值,在下一个赋值语句中又保持number的值。
值42的类型时number,它的类型不能改变。另外一个值,“42”是string 类型。
对一个变量使用typeof,并不是在问这个变量是什么类型,而是在问这个变量中储存的值是什么类型。
undefined
首先要明白undefined是一个基本内置类型,明白这一点后,就可以更好的去明白和undeclared的区别
var a;
a; // undefined
b; // ReferenceError: b is not defined
关于这个错误以及相关的访问,我在作用域部分有详细的解释
typeof undefined
var a;
typeof a; // "undefined"
typeof b; // "undefined"
typeof运算符返回"undefined",尽管这个变量是“undeclared”(或“not defined”,未定义的变量)。请注意,当我们执行typeof b的时候没有抛出任何错误,尽管b是一个未声明的变量。这是typeof的特殊安全保护机制造成的。
如果typeof针对未声明的变量返回“undeclared”,而不是将两种完全不同情况混为一谈都返回“undefined”,这该多好啊!
Nevertheless, this safety guard is a useful feature when dealing with JavaScript in the browser, where multiple script files can load variables into the shared global namespace.
可以用来防止抛出ReferenceError
// oops, this would throw an error!
if (DEBUG) {
console.log( "Debugging is starting" );
}
// this is a safe existence check
if (typeof DEBUG !== "undefined") {
console.log( "Debugging is starting" );
}
补充
'==' 的操作
1.返回的总是布尔值
2.非正常值抛出错误并中断执行
3.相同类型值执行严格等于 ===
4.非相同类型中 Number>String>Boolean = Object