WEB开发(二)——字符串类型

刘秀梅
刘秀梅   编辑于 2018-09-30 07:47
阅读量: 373

 在C语言中的数据类型中没有字符串类型,字符串是字符数组,那么字符串可以遍历。在前端JavaScript中数组和字符串是两种数据类型,也就是字符串类型是存在的,但是字符串仍然可以遍历,通过下标的方式获取。为什么?

 

为甚么字符串还有length属性呢?

 

1. 数据类型

我们讲在JavaScript(ES5)中有五种基本数据类型,Number String Boolean Undefined Null,哎,String是一个基本类型啊。

除了基本数据类型外,我们还有引用数据类型Object。什么是Object?

我们使用过的Function、JSON、String、Array都是Object,都是对象。

问题来了,那么String是基本数据类型,还是引用数据类型呢?

2. 包装对象

 字符串是基本数据类型,为什么有属性,又可以通过下标获取?原因是只要引用字符串的属性,JavaScript就会将字符串通过调用new String(str)的方式转换成对象,这个对象继承了字符串的所有方法和属性。但是,一旦属性和方法引用结束,这个隐式创建的对象就会被销毁,这个过程是隐藏未显的。

同字符串一样,数值和布尔值也具有各自的方法:通过Number()和Boolean()构造函数创建一个临时对象,这些属性和方法的调用都是来自这个临时对象。Null和undefined没有包装对象,访问它们的属性会造成一个类型错误。

到此为止我们解决了String数据类型的认知问题:String是基本数据类型,但是在访问字符串属性和方法的那一刻,它是new String()转换成对象,访问结束之后,它是基本数据类型。

3. 对象访问方式

对象是一系列相关属性和方法的集合。对象有属性和方法,那么如何访问对象的属性和方法呢?

访问对象属性的方式有两种,或者说有两种运算符:

  • 第一种:通过 . 运算符的方式对属性增删改查,比如str.length。点运算符左侧应该是一个表达式,它返回一个对象。右侧必须是一个以属性名称命名的简单标识符。
  • 第二种:通过 [] 运算符的方式对属性增删改查,比如str["length"]。方括号运算符左侧也是一个表达式,返回一个对象。但是方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字。

从形式上看, [] 运算符比 . 运算符书写比较麻烦,优先选择使用 . 运算符。

那么[] 运算符有什么存在的意义吗?我们分析这句话“方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字”,只要计算结果为属性名字的字符串就可以了。

我们可以用一个变量来代替字符串, 那么什么时候使用呢?它的最主要的应用场景就是遍历。想要遍历就需要知道字符串中每个值对应的属性名字。String中的每个值所对应的属性名字是什么呢?

通过我们上面的讲解和代码的演示,我们已经发现字符串中的属性名字是有规律的,貌似和数组相同,都是从0开始,然后1,2,3,4,5......,但是要注意,它们是字符串类型的,严格的说应该是从'0'开始,然后'1', '2', '3', '4', '5' ......。

注:数组的值所对应的下标也是字符串类型的,但是可以通过数值类型访问。

4. 字符串遍历

接触最早的遍历就是通过for循环遍历。

疑问:为什么运行成功了?变量i 的数据类型是Number,[] 运算符不是要求为字符串类型么?

结论是:我们说方括号内的表达式必须返回字符串。其实严格地讲,表达式必须返回字符串或返回一个可以转变为字符串的值。只要转换成字符串之后的值和属性的名字相同就可以了。

分析上述成功原因:Number类型的数字0, 1, 2, 3, 4 隐式转换为String类型的字符串'0', '1', '2', '3', '4'。

思考1:为什么报错?

 

思考2:为什么成功?为什么输出这个值?

 

收藏 转发 评论 2
刘秀梅

思考2回答:在js中有一些关键字和保留字,比如length top,这些变量都有一些特定的含义

所以在起变量名字的时候需要注意这些问题。虽然我没有定义length变量,但是window.length  即length变量的值为 frames的数量,页面中不存在,所以window.length=0;str1[length]==str1[0]   str2[length]==str2[0]

老师能解释一下思考2为什么成功吗