[Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

时间:2022-09-06 15:40:22

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

[Effective JavaScript 笔记] 第4条:原始类型优于封闭对象的更多相关文章

  1. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  2. [Effective JavaScript 笔记]第51条:在类数组对象上复用通用的数组方法

    前面有几条都讲过关于Array.prototype的标准方法.这些标准方法被设计成其他对象可复用的方法,即使这些对象并没有继承Array. arguments对象 在22条中提到的函数argument ...

  3. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  4. &lbrack;Effective JavaScript 笔记&rsqb;第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  5. &lbrack;Effective JavaScript 笔记&rsqb;第57条:使用结构类型设计灵活的接口

    想象创建wiki的库.wiki网站包含用户可以交互式地创建.删除和修改的内容.许多wiki都以简单.基于文本标记语言创建内容为特色.通常,这些标记语言只提供了HTML可用功能的一个子集,但是却有一个更 ...

  6. &lbrack;Effective JavaScript 笔记&rsqb;第68条:使用promise模式清洁异步逻辑

    构建异步API的一种流行的替代方式是使用promise(有时也被称为deferred或future)模式.已经在本章讨论过的异步API使用回调函数作为参数. downloadAsync('file.t ...

  7. &lbrack;Effective JavaScript笔记&rsqb;第3条:当心隐式的强制转换

    js对类型错误出奇的宽容 3+true;  //4 3*””;  //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...

  8. &lbrack;Effective JavaScript 笔记&rsqb;第20条:使用call方法自定义接收者来调用方法

    不好的实践 函数或方法的接收者(即绑定到特殊关键字this的值)是由调用者的语法决定的.方法调用语法将方法被查找的对象绑定到this变量,(可参阅之前文章<理解函数调用.方法调用及构造函数调用之 ...

  9. &lbrack;Effective JavaScript 笔记&rsqb;第66条:使用计数器来执行并行操作

    第63条建议使用工具函数downloadAllAsync接收一个URL数组并下载所有文件,结果返回一个存储了文件内容的数组,每个URL对应一个字符串.downloadAllAsync并不只有清理嵌套回 ...

随机推荐

  1. php的laravel框架快速集成微信登录

    最终的解决方案是:https://github.com/liuyunzhuge/php_weixin_provider,详细的介绍请往下阅读. 本文面向的是php语言laravel框架的用户,介绍的是 ...

  2. Sharepoint学习笔记—习题系列--70-576习题解析 -&lpar;Q49-Q51&rpar;

    Question 49You are designing a SharePoint 2010 intranet site for a corporation. Your design must mee ...

  3. ms sql 导出单个表数据

    然后都是下一步操作

  4. Angular 学习笔记 &lpar;Material Datepicker&rpar;

    https://material.angular.io/components/datepicker/overview 官网介绍很清楚了,这里记入一下我比较不熟悉的. 1. moment js Angu ...

  5. Linux部署项目

    1 安装jdk 第一步:获取Linux系统中jdk安装包和tomcat安装包(后面要用,所以上传两个) 第二步:使用secureCRT客户端工具连到服务器 第三步:使用命令创建一个目录,作为软件的安装 ...

  6. Android基础——Fragment控制切换多个页面

    今天接着上一篇文章,讲解一下Fragment的控制,主要是切换View和页面替换等操作.还有就是如何获取Fragment的管理对象,以及与Activity的通信方式. (PS:新建的QQ群,有兴趣可以 ...

  7. java使用itex读取pdf,并搜索关键字,为其盖章

    导读:近期要做一个根据关键字定位pdf的盖章位置的相关需求,其中关键字可配置多个(包含pdf文档中可能不存在的关键字),当页面显示盖章完成时,打开pdf显示已经损坏. 排查后发现,当itext搜索的关 ...

  8. 慕课网access&lowbar;token的获取

    access_token的接口是微信公众号一个基础接口,access_token接口微信公众号一个非常重要的接口 access_token是微信公众号的全局唯一票据,公众号的所有接口的调用都需要使用到 ...

  9. js无刷新提交表单

    $("#form1").attr("target", "frameFile"); $("#form1").submit( ...

  10. Unix 高手的10个好习惯

    引言 当您经常使用某个系统时,往往会陷入某种固定的使用模式.有时,您没有养成以尽可能最好的方式做事的习惯.有时,您的不良习惯甚至会导致出现混乱.纠正此类缺点的最佳方法之一,就是有意识地采用抵制这些坏习 ...