首页 > 代码库 > 值和类型

值和类型

类型

js中的变量是没有类型的,只有值才有类型,变量可以随时接受任何类型。例如:

     var a = 42;
        console.log(typeof a); //number
        a = ‘44‘;
        console.log(typeof a);//string

undefind 和 undeclared

在js中,已在作用域声明但还没赋值的变量,是undefined。相反还没在作用域中声明过的变量是undeclared

var a;
console.log(typeof a); //undefined 
console.log(b);//Uncaught ReferenceError: b is not defined

需要特别注意的是如果用typeof undeclared 时,会返回undefined。

console.log(typeof b);//undefined

但是这种方式有一个好处就是可以通过typeof来检查变量是否声明过,而不会报错。例如:

if (b) {   //这种方式会报错
    //do something
}

if (typeof b !== "undefined") {
    //do something
}

if (window.b) { //也可以用这种方式 但如果代码会在其他环境中执行的话,会有问题,例如nodejs,全局对象就不是window了。
    //do something
}

 

数组

数组内部可以放任意类型的元素,也可创建稀疏数组。

var a = [];
a[0] = ‘1a‘;
a[2] = ‘23‘;

这里需要注意a[1]的值是undefined。
数组也可以像对象一样有自己的属性,例如:

a[‘name‘] = ‘yu‘;
console.log(a.length);//3

但是数组的属性并不会改变length属性。还有一点需要注意的是,如果属性名称可以转换为十进制数字的话,那么它就会被当做索引来处理。例如:

a[‘13‘] = ‘a‘;
console.log(a.length); //14

类数组

一般在一些dom查询操作返回的元素列表,其实他们并非是真正意义的数组,而是一些类数组。在jq内部经常会使用类数组。

var a = { 1: ‘a‘, 2: ‘b‘, length: 2 };

还一个例子是arguments就是一个类数组,但在es6开始已经废止。
常用的转换类数组为真正的数组的方式为:

var arr = Array.prototype.splice.call(a);

在es6中Array新增了一个内置函数 Array.from() 也可以实现转换功能,例如:

var arr = Array.from(a);

 

字符串

字符串和字符串数组在很多情况下看起来是一样的,但他们并不是一回事。他们都有length属性和indexof等方法。

var a = ‘abc‘;
var b = [‘a‘, ‘b‘, ‘c‘];
console.log(a.length);//3
console.log(b.length);//3
console.log(a.indexOf(‘b‘));//1
console.log(b.indexOf(‘b‘));//1

但是字符串是不可变的,只能创建一个新的字符串并返回,而字符串数组可以在原始值改变的。

a[1] = ‘v‘;
b[1] = ‘v‘;
console.log(a);//abc
console.log(b);//["a", "v", "c"]

在实际开发过程中我们可以借用数组的方法来达到某些目的。

var c = Array.prototype.join.call(a,‘-‘);
console.log(c);//a-b-c

还有一个常见的面试题就是字符串反转问题。
数组上有一个reverse方法,用来反转数组元素,但是我们这里却无法借用,因为字符串是不可变的。
但是我们可以先把字符串转成数组,在进行反转。

var a = ‘xyz‘;
var b = a.split(‘‘).reverse().join();
console.log(b); //z, y, x

 

数字

值和类型