JavaScript个人零散笔记(一)
typeof和instanceof
三种原始类型:数值(Number)、字符串(String)、布尔值(Boolean)
typeof运算符:
- 原始类型:数值、字符串、布尔值分别返回number、string、boolean。
- 函数返回function
- undefined返回undefined
- 除此之外其余全部返回object:数组、null、对象
instanceof运算符:主要用来检测引用类型。typeof用来检测基本数据类型
对象
查看对象所有属性:
1 | var o={ |
返回的是一个数组。
删除属性delete
1 | var o={ |
delete只能删除自有属性,不能删除继承属性。删除一个不存在的属性,delete不报错,而且返回true。只有一种情况delete命令会返回false,那就是该属性存在且不能删除。
数组
1 | var arr=[1,'a',{name:'a'},function(){}]; |
数组属于一种特殊的对象。用typeof检测是返回object。
length属性是可写的。如果认为设置一个小于当前成员个数的值,该数组的成员会自动减少到length设置的值。
将数组清空的一个有效办法就是讲length属性设为0。
如果人为设置length大于当前元素个数,则数组的成员数量会增加到这个值,新增的位置都是空位。
1 | var arr=[1]; |
数组的添加和删除
- push()方法是在数组末尾添加一个或多个元素;
- pop()方法是在数组末尾删除元素。
- unshift()方法是在数组头部添加元素
- shift()方法是在删除数组的第一个元素。
遍历
1 | var a = [1, 2, 3]; |
在JavaScript中,有些对象被称为“类数组对象”。意思是,它们看上去很像数组,可以使用length属性,但是它们并不是数组,无法使用一些数组的方法。
1 | var o = { |
上面代码中,变量o是一个对象,虽然使用的时候看上去跟数组很像,但是无法使用数组的方法。这就是类数组对象。
类数组对象有一个特征,就是具有length属性。换句话说,只要有length属性,就可以认为这个对象类似于数组。但是,对象的length属性不是动态值,不会随着成员的变化而变化。
函数
函数就是一段可以反复调用的代码块。
函数使用function关键字来定义,还包括一个称为形参(parameter)的标识符列表,这些参数在函数体内像局部变量一样工作。
函数调用会为形参提供实参的值。函数使用它们实参的值来计算返回值,称为该函数调用表达式的值。
除了实参之外,每次调用还会拥有另一个值—本次调用的上下文—这就是this关键字的值。
如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方法。
JavaScript的函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量,这就是JavaScript的闭包。
作用域
作用域(scope)指的是变量存在的范围。Javascript只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。 在函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。
1 | var a=1; |
上面的代码中,函数f内部可以读取全局变量a。
在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
1 | function f(){ |
上面代码中,变量v在函数内部定义,所以是一个局部变量,函数之外就无法读取
函数内部定义的变量,会在该作用域内覆盖同名全局变量。
1 | var a=1; |
注意:对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。
闭包
JavaScript的函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量,这就是JavaScript的闭包。 闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。
eval命令
eval命令的作用是,将字符串当作语句执行。
1 | eval('var a=1'); |
eval没有自己的作用域,都在当前作用域内执行
JavaScript规定,如果使用严格模式,eval内部声明的变量,不会影响到外部作用域。
1 | (function(){ |