3.1类型

作者: y小贤 | 来源:发表于2017-02-10 00:43 被阅读9次

    类型与语法

    第一章--类型

    一句话总结

    值有类型,类型为分类使用而生。

    思考

    本身“类型”的出现在于分类。在于区分事物的区别,程序语言的类型的出现在于,程序引擎和开发者在对待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

    相关文章

      网友评论

          本文标题:3.1类型

          本文链接:https://www.haomeiwen.com/subject/azosittx.html