类型
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
数字
时间: 2024-10-07 12:05:02