数组二三事

本篇包含:forEach,slice,一级深度拷贝规则,数组排序等内容

1. forEach操作数组

当我们想对数组所有元素进行自加操作,如果进行如下操作:

var arr=[2,3,4,5];
arr.forEach(function(item,index,arr){
    item++;
    });
console.log(arr);

结果是:

[2,3,4,5]

我们发现原数组并没有变化,因为forEach()的三个参数items,index,array中,items仅获得该数组各个元素的值,所以改变这个值并不会改变原数组。
正确的在原数组基础上修改的方法如下:

var arr=[2,3,4,5];
arr.forEach(function(item,index,arr){
    arr[index]++;
    });
console.log(arr);

结果是:

[3,4,5,6]

2.slice

more >>

关于String的一些细节

Ⅰ.当字符串内含有转义字符时,使用.length返回的是转义后字符串的长度。

var str="\x41";
alert(str.length);//1

同时,即使字符串中包含双字节字符(比如汉字),每个也只算一个字符。

var str="王浩然";
alert(str.length);//3

Ⅱ.字符串一旦创建,它的值不可改变。我们在改变变量保存字符串的值时,实际上一个创建新字符串、赋值、删除原字符串的过程。所以在某些低版本浏览器中,字符串拼接效率较低。

var str="Hello";
str+="World"

过程是得到Hello+World的长度,即10。然后创建一个长度为10的字符串,之后输入"Hello""World"。最后销毁原字符串"Hello"和字符串"World"

Ⅲ.nullundefined没有toString()方法,因为我们在对一个不确定的值使用toString()方法 时,存在报错的风险。
但是另一种转换方法String()则没有这个顾虑,因为String()的转换规则是:
1.如果可以使用toString()方法,则调用并返回。
2.如果值是nullundefined,则对应返回"null""undefined"

Ⅳ.当传入参数为负值时:
slice()将负值与字符串长度相加;
sustr()第一个参数为负,则加上字符串的长度。第二个参数为负,转换为0;
substring()会将所有的副参数转为0。它还有一个行为就是,在面对两个参数时,永远是从小的参数开始,到大的参数对应位置结束。而不是从第一个参数开始。

more >>

从创建一个字符串说起

首先我们可能都知道创建一个字符串通常有三种写法:

var str1="wanghaoran";
var str2=String("wanghaoran");
var str3=new String("wanghaoran");

我们对每一个str执行typeof,可以得到如下结果:

typeof str1;
// 'string'
typeof str2;
// 'string'
typeof str3;
// 'object'

前两种方法创建的字符串都属于Primitive String ,即原始数据类型中的原始类型字符串,返回的自然是string

而第三种方法使用了构造函数创建了一个String Object,所以它的类型是对象,即Object

那么问题来了,为什么一个原始类型的字符串能够调用各种字符串方法或者查看属性呢?这不是对象能做的事吗?

more >>

我是王浩然,15年毕业于合肥工业大学,现就职于趣分期。</br>乐于分享,喜欢折腾。