js零散笔记01

JavaScript个人零散笔记(一)

typeof和instanceof

三种原始类型:数值(Number)、字符串(String)、布尔值(Boolean)
typeof运算符:

  • 原始类型:数值、字符串、布尔值分别返回number、string、boolean。
  • 函数返回function
  • undefined返回undefined
  • 除此之外其余全部返回object:数组、null、对象

instanceof运算符:主要用来检测引用类型。typeof用来检测基本数据类型

对象

查看对象所有属性:

1
2
3
4
5
var o={
name:"a";
age:12
}
Object.keys(o)//["name","age"]

返回的是一个数组。

删除属性delete

1
2
3
4
5
6
var o={
name:"a";
age:12
}
delete o.name
o.name //undefined

delete只能删除自有属性,不能删除继承属性。删除一个不存在的属性,delete不报错,而且返回true。只有一种情况delete命令会返回false,那就是该属性存在且不能删除。

数组

1
var arr=[1,'a',{name:'a'},function(){}];

数组属于一种特殊的对象。用typeof检测是返回object。
length属性是可写的。如果认为设置一个小于当前成员个数的值,该数组的成员会自动减少到length设置的值。

将数组清空的一个有效办法就是讲length属性设为0。
如果人为设置length大于当前元素个数,则数组的成员数量会增加到这个值,新增的位置都是空位。

1
2
3
var arr=[1];
arr.length=3;
arr[1]//undefined

数组的添加和删除

  • push()方法是在数组末尾添加一个或多个元素;
  • pop()方法是在数组末尾删除元素。
  • unshift()方法是在数组头部添加元素
  • shift()方法是在删除数组的第一个元素。

遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var a = [1, 2, 3];   

// for循环
for(var i = 0; i < a.length; i++) {
console.log(a[i]);
}

//while
var i = 0;
while (i < a.length) {
console.log(a[i]);
i++;
}

//for..in
for (var i in a) {
console.log(a[i]);
}

//forEach
a.forEach(function(v){
console.log(v);
})

在JavaScript中,有些对象被称为“类数组对象”。意思是,它们看上去很像数组,可以使用length属性,但是它们并不是数组,无法使用一些数组的方法。

1
2
3
4
5
6
7
8
9
var o = {
0: 'a',
1: 'b',
length:2
}
o[0] // "a"
o[1] // "b"
o.length // 2
o.push('d') // TypeError: o.push is not a function

上面代码中,变量o是一个对象,虽然使用的时候看上去跟数组很像,但是无法使用数组的方法。这就是类数组对象。

类数组对象有一个特征,就是具有length属性。换句话说,只要有length属性,就可以认为这个对象类似于数组。但是,对象的length属性不是动态值,不会随着成员的变化而变化。

函数

函数就是一段可以反复调用的代码块。

函数使用function关键字来定义,还包括一个称为形参(parameter)的标识符列表,这些参数在函数体内像局部变量一样工作。

函数调用会为形参提供实参的值。函数使用它们实参的值来计算返回值,称为该函数调用表达式的值。

除了实参之外,每次调用还会拥有另一个值—本次调用的上下文—这就是this关键字的值。

如果函数挂载在一个对象上,作为对象的一个属性,就称它为对象的方法。

JavaScript的函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量,这就是JavaScript的闭包。

作用域

作用域(scope)指的是变量存在的范围。Javascript只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。 在函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。

1
2
3
4
5
var a=1;
function f(){
console.log(a)
}
f() //1

上面的代码中,函数f内部可以读取全局变量a。

在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。

1
2
3
4
function f(){
var a=1;
}
v //ReferenceError: v is not defined

上面代码中,变量v在函数内部定义,所以是一个局部变量,函数之外就无法读取

函数内部定义的变量,会在该作用域内覆盖同名全局变量。

1
2
3
4
5
6
7
var a=1;
function f(){
var a=2;
console.log(a);
}
f() //2
a //1

注意:对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的。

闭包

JavaScript的函数可以嵌套在其他函数中定义,这样它们就可以访问它们被定义时所处的作用域中的任何变量,这就是JavaScript的闭包。 闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。

eval命令

eval命令的作用是,将字符串当作语句执行。

1
2
eval('var a=1');
a //1

eval没有自己的作用域,都在当前作用域内执行

JavaScript规定,如果使用严格模式,eval内部声明的变量,不会影响到外部作用域。

1
2
3
4
5
(function(){
'use strict';
eval('var a=1');
console.log(a); //ReferenceError: a is not defined
})();
-------------本文结束感谢您的阅读-------------