JavaScript
javascript是ECMAScript规范的一种实现
javascript是一种弱类型脚本语言,所谓的弱类型是指定义变量时,不需要什么类型,在程序运行过程中会自动判断类型。
数据类型
ECMAScript中定义了6种类型(5种基本类型+1种复杂类型)- Undefined
- Null
- Boolean
- Number
- String
- Object
Undefined
该类型只有一个值 undefined,使用var 声明变量但未对其初始化时,这个变量的数值就是undefinedNull
该类型只有一个值 null,空对象的指针,而这也正是使用 typeof
操作符检测null
值会返回object
的原因
应用:
如果定义的变量准备用来保存对象,那么最好将其初始化为null值而不是其他值,这样一来,只要检查null值就知道相应的变量是否已经保存了一个对象的引用
var car = null;
if(car != null){
...
}
Number
NaN
NaN 即非数值(not a number)是一个特殊的数值,用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出异常了),例如,任何数0除以返回NaN,不会影响其他代码的执行 NaN 两个特点- 任何涉及NaN操作返回都是NaN
- NaN与任何值不相等,包括NaN
typeof 操作符
鉴于ECMAScript是松散型的,故需要一种手段检测数值类型—typeof
注意:
- typeof null 结果是object
- typeof [1,2] 结果是object,不是array 所以引用类型除了function都是object
instanceof
用于实例和构造函数的对应关系,例如判断一个变量是否为数组时,typeof无法判断,但是可以使用
[1,2] instanceof Array 来判断,因为数组的构造函数就是Array。
例如
function Foo(name){
this.name = name
}
var foo = new Foo('bridge');
console.log(foo instanceof Foo)//true
值类型VS引用类型
javascript根据变量的传递方式,又分为值类型
(Boolean,String,Number,Undefined,Null)和引用类型
(包括了Object类的所有,如Date,Array,Function等)
值类型
的值是存储在栈内存
里
引用数据
类型的值是保存在堆内存
中的对象,值大小不固定,栈内存
中存放指向堆内存中的对象的指针
原型和原型链
Javascript是基于原型的语言,如何理解Javascript的原型?
通过记忆以下几个要点来理解
- 所有引用的类型(数组,对象,函数),都具有对象特性,即可以自由拓展属性
- 所有引用类型(数组,对象,函数),都有一个_proto__属性,指向所属类的prototype
内存问题
栈内存
当代码运行到栈内变量
的作用域以外时候,变量被摧毁,并且堆中的引用计数 - 1
而当原本指向的为引用变量的变量被重新赋值
,修改为其他值或者引用变量,引用计数也会 - 1
堆内存
中的对象,有一个引用计数
GC垃圾收集,内存回收机制 GC的时间
,第一,堆内存达到一定使用门槛
,第二,定期
将引用数为0的摧毁
运算符
==相等
——先转换再比较===全等
——仅比较不转换
类型转换
转化为数值
parseInt(parseFloat)
和Number
的区别比较parseInt(“100px”);
看上去像数字,数字开头参杂其他
Number(true)
本质上可以转化为数字true
false
null
都不可以,undefined,字母开头
转化为字符串
String()
.toString()
转化为bolean
!隐性转换
Bolean()
循环
for循环最常用的地方是利用索引来遍历数组
例如:
var arr = ['Baidu', 'Alibaba', 'Tencent'];
var i, x;
for (i=0; i<arr.length; i++) {
x = arr[i];
console.log(x);
}
for-in可以用来枚举对象的属性
例如:
var object = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for(var key in object){
console.log(key)//'name', 'age', 'city'
}
数组
push pop unshift shift
-
清空数组的三种方法
-
1.length
arr.length=0;
-
2.splice
arr.splice(0);
-
3.[]
arr=[]
对象
-
创建对象
var obj1 = {}; var obj2 = new Object();
-
对象的属性可以为函数
ps.使用[]访问对象里的方法 ex.obj['function']();
-
对象中的
属性名
必须是符合变量名
命名规则,含有特殊符号
,如“ ”
,"-"
需要用字符串
表示 -
用
,
分隔开每一对key-value,最后一对
不需要在末尾加,
如果加了,有的浏览器(如低版本的IE
)将报错。 -
访问属性
点表示法
方括号表示法
-
使用
变量
来访问,或者属性名
包含会导致语法错误,[ ]
里面传入的是字符串
,使用方括号表示法
查询属性是否存在
obj.hasOwnProperty('key')
'key' in obj
删除属性delete obj.key
修改属性obj.key=value1
构造函数
包装类
- 三种特殊的引用类型
Boolean Number String
- 基本类型存在一些的特殊行为,
var s1 = 'some text'
var s2 = s1.substring(2)
实际上 在读取一个基本类型值,后台就会创建一个对应的基本包装类型对象,从而使得我们能够调用一些方法来操作这些数据
预编译
先扫描后运行脚本中所有的
变量和函数声明
都在预编译完成,与变量声明实际书写的位置无关
变量声明(var) 没有var的变量
都为window的全局变量
不参与预编译
函数声明 function 函数名(){}
函数表达式function(){}
注意,脚本中如果变量名和函数名相同,函数会将变量覆盖。相同函数名,后面的函数会覆盖前面的函数,忽略参数
函数预编译
var scope = 'global';
function f(){
console.log(scope);//undefined
var scope = 'local';
console.log(scope);//local
}
console.log(scope);//global
f();
JS作用域
JS作用域都是属于函数级别
的,不同于java ,c的块级别
{ }部分
https://blog.csdn.net/jnshu_it/article/details/77915624
正则表达式
/\d+/g
\s \S
产生特定范围内随机数字 Math.floor(Math.random()*(maxNum-minNum+1))+minNum
构造函数
私有属性
map
filter
return 位置放for外面
substring(start,stop)
var arr = str.replace(/\s+/g, “”);
DOM 操作中注意获取到value的内容多为字符串
BOM
出于安全的考量,js只能对新开的window进行操作
- alert
- prompt
- confirm
- open
- close
- moveTo
- resizeTo
Prototype
Prototype特点
凡是函数都有prototype属性
凡是函数构造的对象,都有属性__proto__
prototype, __proto__指向同一对象
Prototype作用
生成的对象具有prototype的属性和方法