js数据类型:
1、基本(值)类型:
String:任意字符串
Number:任意数值
boolean: True False
undefined: undefined
null: null
undefined 和null 区别: undefined 定义了变量未赋值 null定义了变量并赋值为null
var a; typeof a 是'undefined'
a=null typeof a 是 ‘object'
什么时候用null:
var c=null 初始赋值为null,表明将要赋值为对象
c=[1,4,334]
c=null 最后将赋值为null 等待垃圾回收器进行回收释放内存
2、 对象(引用)类型 :
Object: 任意对象
Function: 一种特殊对象(可以执行)
Array: 一种特殊对象(数值下标,有序的)
数据类型判断:
typeof: 返回的结果是变量的数据类型字符串('undefined' 'string' 'number' 'object' 'boolean' 'function')
instanceof: 用于对象类型 判断对象具体类型
===: undefined null
var a ;
console.log(a, typeof a, a === undefined, typeof a === 'undefined') // undefined 'undefined' true true
a=4
console.log( typeof a === 'number') //true
a='www'
console.log( typeof a === 'string') //true
a=null
console.log( typeof a, a===null) //'object' true
var b1= {
b2: [1,'abc',console.log],
b3: function() {
console.log('b3')
}
}
console.log(b1 instanceof Object, b1 instanceof Array) // true false
console.log(b1.b2 instanceof Object, b1.b2 instanceof Array) // true false
console.log(b1.b3 instanceof Object, b1.b3 instanceof Function) // true true
3、变量内存
var a=xxx //若xxx是基本类型 则a内存存储的是xxx值 若xxx是对象类型 则a内存存储的是对xxx堆内存地址
var obj1= {name:'tom'}
var obj2=obj1 //此时obj1 obj2同时指向堆内存同一个对象内存地址
obj1.name ='jack'
console.log(obj2.name) // jack
obj2.age=22
console.log(obj1.age) //22
function fun1(obj) {
obj.name='AAA'
}
fun1(obj1)
console.log(obj2.name) // AAA
在js调用函数时传递变量参数时,是值传递(基本类型是值 引用类型是对象内存地址值)
var a=3
function fun(a){
a=a+1
}
fun(a)//此时传的是变量a的值3
console.log(a) //3
var obj={name:'howhy'}
function fun1(obj){
console.log(obj.name) //howhy
}
fun1(obj) //此时传递的是obj的内存地址值
局部变量函数执行完时释放 对象最后由垃圾回收器进行回收
4、函数
函数定义有两种方法:1、 函数声明 function fun() {} 2、函数表达式 var fun1=function(){}
函数执行:1、括号 2、Object.fun1() 3、函数名.call/apply(对象) 这样执行可以改变方法的this(也就是可以将这个方法添加到任意对象)
var obj={}
function test(){
this.xxx='xxx111'
}
test.call(obj)
console.log(obj.xxx) //xxx111
回调函数的特点:1、自定义的 2、 没有手动调用 3、它自己执行了 例如:dom事件 setTimeout
IIFE: Immediately-Invoked Function express 立即执行函数表达式 //隐藏实现 不会污染全局命名空间 编译js代码
(function(){
var a=1
function test(){
console.log(++a)
}
window.$=function(){
return {test: test}
}
})()
$().test() // 2
5、this : 1、任何函数的本质执行都是通过某个对象调用执行的,如果没有直接指定就是window 2、所有函数内部都有一个变量this 3、它的值就是调用函数的当前对象
6、js语句是否加分号编码问题:js一条语句后可不加分号 下面两种情况需在语句前加分号:小括号或中括号开头的语句
var a=3
;(function(){
console.log(11111111)
})()
var b=4
;[1,3,4].forEach(function(){})
7、原型链 1、每个函数(类)都有一个prototype属性,即显式原型(属性) 2、每个实例对象都有一个__proto__即隐式原型(属性)
3、对象实例的隐式原型的值为对象显式原型的值 new Date().__proto__===Date.prototype
对象属性查找:1先查找自身隐性原型 然后查找对象显式原型
4、函数的显式原型指向的对象默认是空Object的实例对象
console.log(fn.prototype instanceof Object) //true
console.log(Object.prototype instanceof Object) //false
console.log(Function.prototype instanceof Object) //true
5、所有函数都是Function的实例 console.log(Function.__proto__===Function.prototype)
6、 Object的原型对象是原型链的尽头 console.log(Object.__proto__.prototype) //null