zoukankan      html  css  js  c++  java
  • [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值、数字、字符串、null和undefined。

    用typeof检测一下:

    typeof true; //"boolean"

    typeof 2; //"number"

    typeof “s”;//"string"

    typeof null;//"object":ECMAScript把null描述为独特的类型,但返回值却是对象类型,有点困惑。

                           可以使用Object.prototype.toString.call(null);//"[object Null]" 可以正确判断出null类型。

    typeof undefined;//"undefined"

    标准库提供了构造函数来封装布尔值、数字、字符串作为对象。

    var s1=”hello”;

    以构造函数的方法来创建则为

    var s2=new String(“hello”);

    String对象的行为和其封装的字符串值类似。

    1、可以用加运算符

    s1+” world”;//”hello world”

    s2+” world”;//”hello world”

    2、可以进取其索引的字符串

    s1[4];//”o”

    s2[4];//”o”

    不同于原始的字符串,String对象s2是真正的对象。

    typeof s1;//”string”

    typeof s2;//”object”

    每个String对象都是一个单独的对象,其总是只等于自身。对于非严格相等运算符,结果也一样。

    var s3=new String(“hello”);

    s2==s3;//false

    另:

    s1==s2;//true

    因为s2调用了toString方法隐式转化了,此处见《[Effective JavaScript笔记]第3条:当心隐式的强制转换

    其存在的主要理由是它们的实用方法。结合另外的隐式强制转换,js使得我们可以方便地使用这些实用方法,这里是另一种隐式转换:当对原始值提取属性和进行方法调用时,它表现得就像已经使用了对应的对象类型封装了该值一样。

    举例:String的原型对象有一个toUpperCase方法,可以将字符串转换为大写。你也可以对原始字符串调用这个方法。

    “hello”.toUpperCase();//”HELLO”

    注意:这种隐式转换可以对原始值设置属性,但是对其没有任何影响

    “hello”.someProperty=17;

    “hello”.someProperty;//undefined

    原因:因为每次的隐式转换都会生成一个全新的封装对象,更新第一个对象并不会造成持久的影响。

    对原始值设置属性是没有意义的,但觉察到这种行为是值得的。可以避免下面BUG的产生。

    本来你想给一个对象设置属性,但没注意其实它是个原始值,程序只是忽略这个设置,继续执行。这种错误很难调试。

    提示

    1、当做相等比较时,原始类型的封装对象与其原始值行为不一样。原始值一定等于原始值,封装对象不等于相同的值的封装对象。“mm”==”mm” ;   new String(“mm”) != new String(“mm”)

    2、获取和设置原始类型的属性会隐式地创建封装对象。每次都会创建一个新的封装对象,所以设置的值不会保留。

  • 相关阅读:
    20169218 2016-2017-2 《网络攻防实践》第八周学习总结
    20169218 2016-2017-2 《网络攻防实践》第七周学习总结
    20169218 2016-2017-2 《网络攻防实践》第六周学习总结
    20169218 2016-2017-2 《网络攻防实践》第五周学习总结
    20169218 2016-2017-2 《网络攻防实践》第四周学习总结
    十三周作业—使用Metaspoit攻击MS08-067
    20169206 2016-2017-2 《网络攻防实践》课程总结
    《网络攻防》第十四周作业-免杀
    《网络攻防》 第十二周作业 SQL注入
    《网络攻防》 第十一周作业
  • 原文地址:https://www.cnblogs.com/wengxuesong/p/5474106.html
Copyright © 2011-2022 走看看