JS高级
基础总结深入
- 数据类型
a.分类
基本类型(又称值类型):
String (任意字符串)
Number (任意数字)
boolean (true/false)
undefined (undefined)
null (null)
对象类型(又称引用类型):
Object (任意对象)
Function (一种特殊的对象,可以执行)
Array (一种特殊的对象,数值下标,内部数据有序)
b.判断
typeof (返回数据类型的字符串表达
)
可以判断:undefined/数值/字符串/布尔值/function
不能判断:null与Object Object与Array
instanceof(判断对象的具体类型,返回布尔值
)
绝对等于符号(===)
可以判断undefined,null
<script type="text/javascript">
//1.基本
var a;
console.log(a,typeof a,typeof a === 'undefined',a === undefined);//undefined 'undefined' true true
console.log(undefined === 'undefined');//false
a = 4;
console.log(typeof a === 'number'); //true
a = 'cxq';
console.log(typeof a === 'string'); //true
a = true;
console.log(typeof a === 'boolean'); //true
a = null;
console.log(typeof a,a === null); //'object' true
//2.对象
var b1 = {
b2: [1,'abc',console.log],
b3: function(){
console.log('b3');
return function(){
return 'cxq';
}
}
}
console.log(b1 instanceof Object,b1 instanceof Array); //instance实例的意思 true false
console.log(b1.b2 instanceof Array,b1["b2"] instanceof Object);
console.log(b1.b3 instanceof Function,b1.b3 instanceof Object);
console.log(typeof b1.b2,'-----'); //'object'
console.log(typeof b1.b3 === 'function'); //true
console.log(typeof b1.b2[2] === 'function'); //true
b1.b2[2](4);
console.log(b1.b3()());
</script>
c.相关问题
undefined和null的区别?
undefined代表定义了未赋值,null代表定义并赋值了,只是值为null
什么时候给变量赋值为null?
初始赋值:表示将要赋值为对象
结束前赋值:让对象成为垃圾对象,进而被回收
严格区分变量类型与数据类型?
变量的类型实质上指的是变量内存值的类型,基本类型保存的就是基本类型的数据,引用类型保存的是地址值。JS是弱类型的语言,变量本身是没有类型的,我们所讨论的类型其实是变量所保存的数据的类型,只是平时不加区分就是说的变量的类型
<script type="text/javascript">
//实例:实例对象
//类型:类型对象
function Person(name,age){ //构造函数 类型
this.name = name;
this.age = age;
}
var p = new Person('tom',12); //根据类型创建的实例对象
//Person('jack',13);
var a;
console.log(a); //undefined
a = null;
console.log(a); //null
var b = null; //初始赋值为null 表明将要赋值为对象
b = ['1','2']; //确定对象就赋值
b = null; //让b指向的对象成为垃圾对象(被垃圾回收器回收)
//b = 2; 同样可以切断那条线,但是没有意义
</script>
d.数据_变量_内存
什么是数据?
存储在内存中代表特定信息的载体,本质上是010101…,特点可传递,可运算
什么是变量?
由变量名和变量值组成的可变化的量。每个变量都对应一块小内存,变量名用来查找对应的内容,变量值就是内存中保存的数据
什么是内存?
内存条通电后产生的可存储数据的临时空间。一块小内存有2个数据:内存存储的数据、地址值
内存的分类
栈:存储全局变量和局部变量
堆:存储对象
三者之间的关系?
内存是用来存储数据的空间,变量是内存的标识,我们通过变量找到对应的内存,进而操作内存中的数据
e.相关问题
关于赋值和内存的问题:var a = xxx,a内存中到底保存的是什么?
xxx是基本数据,保存的就是这个数据
xxx是对象,保存的是对象的地址值
xxx是变量,保存的是变量的内存内容(可能是基本数据,也可能是地址值)
关于引用变量赋值问题
n个引用变量指向同一个对象,通过某个变量修改对象内部数据,其他所有变量看到的是修改之后的数据
2个引用变量指向同一个对象,让其中一个引用变量指向另一个对象,另一个引用变量依然指向前一个对象
<script type="text/javascript">
var obj1 = {name: 'Tom'};
var obj2 = obj1;
obj2.age = '12';
console.log(obj1.age); // '12'
function fn(obj){
obj.name = 'A';
}
fn(obj1);
console.log(obj2.name) //'A'
var a = {age: 12};
var b = a;
a = {name: 'Tom',age: 13};
b.age = 14;
console.log(b.age,a.name,a.age); // 14 'Tom' 13
//执行形参赋值 obj = a,这是两个同时指向了对象{age:13,name:'Tom'}
//然后执行obj = {age: 15}注意是等于,不是.,就是obj指向了新的对象{age: 15}
//不再指向a指向的对象,两个互不干涉
function fn2(obj){
obj = {age: 15};
}
fn2(a);
console.log(a.age); //13
</script>
在JS调用函数时传递变量参数,是值传递还是引用传递?
理解1:都是值传递,传递的是基本数据类型的值或者对象的地址值
理解2:可能是值传递,也可能是引用传递,基本数据类型就是值传递,对象类型是引用传递,传递的是地址值
<script type="text/javascript">
var a = 3;
//值传递,相当于执行 a = 3,先读取全局变量a的值3,再赋值给形参a
//传递的参数是3,跟全局变量a没有关系了,所以全局a还是3,为什么要用两个a嘛
//我故意混淆的
function fn(a){
a = a + 1;
}
fn(a);
console.log(a); //3
</script>
JS引擎如何管理内存?
内存生命周期:
分配小内存空间—>得到它的使用权—>存储数据,可以反复进行操作—>释放小内存空间
释放内存:
局部变量:函数执行完后自动释放
对象:成为垃圾对象---->垃圾回收器回收
f.对象
什么是对象?
多个数据的封装体
用来保存多个数据的容器
一个对象代表现实中的一个事物
为什么要用对象?
统一管理多个数据
对象的组成?
属性:属性名(字符串)加属性值(任意值)组成
方法:一种特别的属性(属性值是函数)
如何访问对象内部数据?
对象名.属性名
对象名[‘属性名’]
什么时候必须使用对象名[‘属性名’]的方式?
属性名包括特殊字符:-,空格
属性名不确定的时候
<script type="text/javascript">
var p ={};
//p.content-type = 'text/json'; 报错
p['content-type'] = 'text/json';
console.log(p['content-type']);
var propName = 'myAge';
var value = 18;
p[propName] = value;
console.log(p[propName]);
</script>
g.函数
什么是函数?
实现特定功能的n条语句的封装体,只有函数是可以执行的,其他类型的数据不能执行
为什么要用函数?
提高代码复用,便于阅读复用
如何定义函数?
函数声明
表达式
如何调用(执行)函数?
test() 直接调用
obj.test() 通过对象调用
new test() 构造函数调用
test.apply(obj)/test.call(obj) 在指定对象上调用,临时让test成为obj的方法进行调用
<script type="text/javascript">
function fn(){ //函数声明
}
var fn1 = function(){} //表达式声明
function fn2(){
this.xxx = 'cxq';
}
var obj = {};
//obj.fn2() 不能直接调用,因为根本就没有
fn2.call(obj); //可以让函数成为指定任意对象的方法进行调用
console.log(obj.xxx);
</script>
回调函数
什么是回调函数?
你定义了
你没有调
但最终它执行了
常见的回调函数
dom事件回调函数
定时器回调函数
ajax请求回调函数
生命周期回调函数
IIFE(Immediately-Invoked Function Expression) 立即执行函数表达式,又称匿名函数自调用
作用
隐藏实现
不会污染外部(全局)命名空间
用来编写JS模块
<script type="text/javascript">
(function(){
var a = 3;
console.log(a + 3);
})(); //匿名函数自调用
var a = 4;
console.log(a);
(function(){
var a = 1;
function test(){
console.log(++a);
}
window.$ = function(){ //向外暴露一个全局函数
return {
test: test
}
}
})();
$().test(); //$是一个函数,$执行后返回一个对象,对象有test这个方法
</script>
this
this是什么?
任何函数本质上都是通过某个对象来调用的,如果没有指定就是window
所有函数内部都有一个变量this
它的值是调用函数的当前对象
如何确定this的值?
this只有在函数调用的时候才会发生绑定,谁调用的这个函数,函数中的this就指向谁
好了,我的分享就到这里了,谢谢大家