接着昨天的文章,今天这篇文章主要讲述JS中剩余的两种数据类型String,和Object

String类型

对于该类型,书中给出的解释为:由0或多个16为Unicode字符组成的字符序列。

对于JS中的String类型首先要明确的是,在JS中单引号,和双引号是没有区别的,跟PHP及部分语言单双引号会影响对字符串的解释不同。

虽然单双引号没有什么不同,但是要保证引号的闭合,即你不能用单引号开头,双引号结尾。

这一特点在es6的模板字符串出来之前,能使我们对字符串的拼接简单许多。

比如,在JS中操作DOM节点的时候,一些标签属性的写法需要我们使用引号将其引用起来,那么这种时候我们就可以标签内部用单引号,外部用双引号来进行拼接

var str = "<a href='www.baidu.com'></a>"+"<a href='www.baidu.com'></a>"

在JS中,也有一些转译字符,即一些特殊的字符字面量,这些字符具有其它的用途

\n  换行

\t  制表

\b  退格

\r  回车

\f  进纸(一般出现在打印中)

\\  斜杠

\'  单引号

\"  双引号

\xnn  以十六进制代表的一个字符,\x41 A

\unnn  以十六进制代表的Unicode字符,\u03a3 ∑

上面的这些特殊字面量的使用场景是在需要在字符串中打印出一些特殊字符的时候。

关于字符串的长度,书上有这么一句话,如果字符串中包含双字节字符,那么length的长度可能不精确。

众所周知,中文是双字节字符,但不管我怎么测长度都是正确的。

联系着上文的String的定义,是由16位Unicode编码组成的,那么很显然String应该对Unicode编码中有的字符都能正确地计算字符串的长度。

所以我找了个Unicode编码中没有的字进行测试,就是四个龙叠在一起那个繁体字(zhe),返回的值为2

原因在于现在采用的Unicode码为16位,一共只能表示6万多个符号,而中文算上繁体字就有6,7万字所以16位的Unicode编码只收录了常用的6,7千字。

而那些装不下的繁体汉字用的是32位的unicode码,所以这里的长度返回为2

不过我们不用太过担心,因为这样的字符在浏览器中是无法显示的

拿刚才那个字来说,百度的title为:

可以看到是无法显示的

除了length之外字符串还有一个特点,那就是JS中的字符串是不可变的。

字符串一旦创建,那么这个字符串的值就不能改变。

而我们修改保存字符串的变量的值,实际上JS会销毁原本的字符串,然后以新值来填充变量。

这也是低版本浏览器字符串拼接速度很慢的原因。

字符串转换

把一个类型的值转换为一个字符串有两种方式

1.通过值的toString方法(只有null、undefined没有该方法),该方法可以传入基数,即以几进制输出字符串

2.通过字符串转换方法String()来进行转换,该方法转换规则如下

  • 对于有toString方法的值,调用该方法并返回结果(返回的值不能为object)
  • 如果值为null返回“null”
  • 如果值为undefined返回“undefined”
  • 对于toString()的返回值为Object的值,则调用该值的valueOf方法,若返回值仍为Object则报错

Object类型

这也就是我们常说的对象类型

关于该类型的声明,有两种方式一种是字面量的方式,另一种是通过构造函数的方式

var a = {};
var b = new Object();
var c = new Object;

如上图所示,不过最后一种不推荐使用,即使你并不需要为构造函数传入参数,因为在JS中带括号的构造函数的优先级会高一些。

如果你不带括号那么在代码执行的过程中很可能出现一些意料之外的错误。

Object类型是所有它的实例的基础,每个Object的实例都有以下的属性和方法:

  • constructor:保存着创建当前实例的构造函数
  • hasOwnProperty(属性名):该方法用于判断某一属性是否属于当前实例,而不是通过原型链继承而来(该方法的参数必须以字符串的形式指定)
  • isPrototypeOf(对象):判断传入的对象是否为当前实例的原型
  • propertyIsEnumerable(属性名):判断某一属性名是否可被枚举,即能否使用for-in循环将其遍历出来
  • toLocalString():返回对象的字符串表示,与执行环境的地区相对应
  • toString():返回对象的字符串表示
  • valueOf():通常与toString的方法的返回值相同

需要注意的是并非所有对象都继承自Object,因为BOM对象和DOM对象是由浏览器实现的,浏览器厂商不一定会让其继承自Object

而有关Object的类型转换:

  1. 转为Boolean 所有对象全为true
  2. 转为String 使用String()进行转换,具体转换规则在上方已经介绍
  3. 转为Number使用Number()进行转换,具体转换规则在上一篇文章

至于实例上的方法和属性会在写原型和对象关系的时候一起写。

这里就不讲原型和继承的一些东西了,等我写到那里的时候再详细讲,明天的内容是JS中的操作符

感兴趣的小伙伴可以期待一下emm....

Javascript高级编程学习笔记(4)—— JS中的数据类型(2)的更多相关文章

  1. Javascript高级编程学习笔记(3)—— JS中的数据类型(1)

    前一段时间由于事情比较多,所以笔记耽搁了一段时间,从这一篇开始我会尽快写完这个系列. 文章中有什么不足之处,还望各位大佬指出. JS中的数据类型 上一篇中我写了有关JS引入的Script标签相关的东西 ...

  2. Javascript高级编程学习笔记(5)—— JS操作符

    话不多说,开始今天的码字之旅. 突然有种日更小说的感觉,emm... 操作符 ECMAScript(JS核心)描述了一组用于操作数据值的操作符,也包括算术操作符等等 而JS中这些操作符最鲜明的特点就是 ...

  3. Javascript高级编程学习笔记(43)—— 动态脚本

    动态脚本 大多数情况下,DOM操作都很简洁明了 因为DOM主要就是用来操作页面中的可视节点的 但有些时候我们又希望可以动态的来进行DOM操作 其中的一部分也就是今天我们的内容动态脚本 动态脚本是什么意 ...

  4. Javascript高级编程学习笔记(35)—— DOM(1)节点

    DOM JS由三部分组成 1.BOM 2.DOM 3.ECMAScript ES和BOM在前面的文章已经介绍过了 今天开始JS组成的最后一部分DOM(文档对象模型) 我们知道,JS中的这三个部分实际上 ...

  5. Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域

    昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...

  6. Javascript高级编程学习笔记(23)—— 函数表达式(1)递归

    前面的文章中,我在介绍JS中引用类型的时候提过,JS中函数有两种定义方式 第一种是声明函数,即使用function关键字来声明 第二种就是使用函数表达式,将函数以表达式的形式赋值给一个变量,这个变量就 ...

  7. Javascript高级编程学习笔记(18)—— 引用类型(7)单体内置对象

    什么是内置对象呢? js高级程序设计中给出的定义为:由ES规定不依赖于宿主环境的对象,这些对象在JS执行前就已经存在 前面我们介绍的引用类型都是内置对象 除了这些对象外ECMA还规定了两个单体内置对象 ...

  8. Javascript高级编程学习笔记(15)—— 引用类型(4)RegExp类型

    JS中处理字符串最常用的应该就是正则了 同样正则(RegExp)类型也是JS中引用类型的一种 ECMAScript通过 RegExp类型 来支持正则表达式 创建正则 var expression = ...

  9. Javascript高级编程学习笔记(10)—— 作用域、作用域链

    昨天介绍了,JS中函数的作用域 什么词法环境之类的,可能很多小伙伴不太明白. 在今天的内容开始之前,先做个简短的声明: 词法环境这一概念是在ES5中提出的,因为词法环境主要用于保存let.const声 ...

随机推荐

  1. 非virtual函数,用指针进行upcast

    void print_func(A* p) { p -> print(); } int main() { A a(); B b(,); //a.print(); //b.print(); pri ...

  2. 合批只是对CPU的优化,与GPU没有任何关系

    如题. 今天细想了下合批这个东西. 合批是节省了CPU的相关准备工作的工作量. 合批后,经过VS,PS,尝试测试,模板测试后,此时已没有了纹理,顶点,索引的概念,只剩下一个个孤立的像素,各像素间没有任 ...

  3. thinkphp5.0 - Redis 实现秒杀

    首先,因为秒杀这个环节在商城项目中比较常见,最近写商城项目,碰到这个功能模块,于是就拿出来给大家分享一波. 难点:高并发的情况下,正常逻辑写的话数据库的库存会出现负数,对付这类问题有很多解决方案,我就 ...

  4. Reboot-less node fencing in Oracle Clusterware 11g Release 2

    在进行一次RAC的高可用性测试时,当private网卡的网线被拔掉之后,没有出现传说中的有一个节点被CRS强制重启,取而代之的是node2上面的ASM实例和RDBMS实例被关闭:当网线被重新插上时,n ...

  5. Java中的包装数据类型

    基本类型 包装器类型 boolean Boolean char Character int Integer byte Byte short Short long Long float Float do ...

  6. JVM参数类型

    java -version看版本号(混合模式) java -Xint -version  解释执行 java -Xcomp -version 编译执行 XX参数是不稳定的用来JVM调优和DeBug B ...

  7. 【测试工具】Macaca 自动遍历器 NoSmoke

    Macaca 提供的基础能力上研发出了一套多端深度遍历爬虫工具. 希望可以最大化减少UI 测试脚本的编写涵盖以下功能点: 支持iOS, Android,PC-Web 三个平台的自动化测试 同时可以通过 ...

  8. [剑指Offer]7-重建二叉树

    链接 https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPa ...

  9. zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP

    阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库  http://download.zeromq.org ...

  10. Json中对日期的处理

    前言:Json对日期的处理很特别,我们不能简单的转换而得到我们想要的结果,需要进行特殊处理 一.JSon序列化和反序列化对日期的处理 JsonHelper类: using System.IO; usi ...