数据类型
基本数据类型
单一的值
值和值之间没有关系
基本数据类型存在栈内存中 当比较两个基本数据类型时比较的就是值,就算赋值,一个值的变化不会影响另一个。
var a = 10;
var b = a;
a++;
console.log(a); //11
console.log(b); //10
-
String 字符串
-
Boolean 布尔
用于逻辑判断 -
NULL
Null类型的值只有一个 就是null
这个值专门是用来表示空对象
typeof null 返回的事object
var a = null
console.log(typeof a); //object
- undefined
Undefined的值只有一个 就是undefined
当声明一个变量 但不对其进行赋值
typeof undefined 返回undefined
var a
console.log(typeof a); //undefined
- Number
所有数值都是Number类型 整数和浮点数
浮点元素运算可能会得到一个不精确的值
NAN是特殊的数字 Not A Number
引用数据类型
在对象中可以保存多个不同数据类型的属性
引用类型存在堆内存中,当比较两个引用数据类型的值时,就是比较内存地址,如果两个对象一模一样,但是地址是不同的,比较返回的值为false。
var obj1 = new Object();
var obj2 = new Object();
obj1.age = 20;
obj2.age = 20;
console.log(obj1 == obj2); //false
赋值其实是把地址赋值
var obj1 = new Object();
obj1.age = 20;
var obj2 = obj1;
console.log(obj1.age);
console.log(obj2.age);
对象是保存在堆内存中,当创建(new)一个对象时,就会在内存中开辟一个新空间,而变量保存的是对象的内存地址(对象引用),如果两个对象保存的事同一个对象引用,那么通过一个变量修改属性,另一个也会受到影响。
-
Object
对象的分类:- 内置对象:全局对象、Math、Date、String、Number、Object、Function、Array、Boolean。
- 宿主对象:由JS运行环境所提供的对象,目前为浏览器提供的对象BOM、DOM。
- 自定义对象:由开发人员自己创建的对象。
创建对象:
var obj= new Object();
使用new关键字来调用函数,该函数是构造函数constructor。
构造函数是专门用来创建对象的函数。
对象的字面量:
var obj = {
uname: 'lyz',
age: 21
}
在创建对象时,直接指向对象的属性。(属性可以不加引号,但是有特殊的名字时,必须加引号。)
对象.属性名若无值,则返回undefined。
var obj = {
uname: 'lyz',
age: 21
}
console.log(obj.like); //undefined
- Function
函数可以封装一个功能(代码),在需要的时候可以执行这些功能(代码)。
typeof 函数名 -> function
使用函数声明创建函数
function f([a,b,...]) {
//代码
}
函数表达式
var f = function () {
console.log('f函数被调用了');
}
函数解析器不会检查实参的数据类型
如果实参的数量小于形参的数量,那么没有定义的为undefined。
return后的语句不再执行
return后无值返回undefined
函数也可以作为对象的属性
如果以后一个函数作为对象的属性保存,那么称这个函数为对象的方法,调用函数就是调用对象的方法。只是名称不同。
变量提升和函数提升
变量提升
使用var声明的变量,会在所有的代码执行前声明,但不会赋值。但是声明变量前不用var,那么不能在执行前声明。
函数提升
使用函数声明形式创建的函数,会在所有代码执行前,就被创建,所以在函数调用声明在函数声明之前。
使用函数表达式创建的函数,不会被提前声明,所以不能在函数创建前带调用。
f() // f函数被调用了
f2() // 报错
//函数声明
function f() {
console.log('f函数被调用了');
}
//函数表达式
var f2 = function () {
console.log('f2函数被调用了');
}
this指向
解析器在调用函数时,每次都会传入一个隐藏的形参,就是this。
this是一个对象 ,称函数执行的上下文对象。
调用函数的方式不同时,this的指向也不同。
- 普通函数
function f() {
console.log(this);// window
}
f()
- 对象中的方法
function f() {
console.log(this);// obj
}
var obj = {
uname: 'lyz',
like: f
}
obj.like();
- 绑定事件
var div = document.querySelector('div');
div.onclick = function () {
console.log(this); //<div></div>
}
- 定时器
setTimeout(function () {
console.log(this);
}, 10) //window
- 立即执行函数
(function f() {
console.log(this);// window
})(); //前后都要加分号
- 构造函数
function Per() {
this.uname = 'lyz';
console.log(this); // lyz
}
Per.prototype.speak = function () {
console.log(this); // lyz
}
var lyz = new Per();
lyz.speak();