JavaScript 高级

一、数据类型

在 JS 中 字符串不只是字符串 还是一个对象

string类型
var str = 'xxxxxx';//一般声明方式
var str2 = new String('yyyyyy');//底层原型声明方式->对象

array类型(typeof为object) //万物皆对象(函数)
var arr = [1,2,3];//一般声明方式
var arr2 = new Array();//底层原型声明方式->对象

object类型
var obj = {};//一般声明方式
var arr2 = new Object();//底层原型声明方式->对象

二、构造函数 (本质为自定义函数)

区别:构造函数与自定义函数唯一没有意义的区别为构造函数命名方式采用大驼峰
作用:一般用来构建对象(通过 new 关键字实例化)如 newString() new Array()

//构造函数
function Xiaohuwei(){
    console.log('Hello world');
}
//自定义new一个女朋友对象
function Grilfriend(){
    console.log('memeda');
}
//实例化
var gf = new Grilfriend();

判断是否为真数组

var arr = [1,2,3];
通过instance关键字判断//instanceof判断原型对象是否一致(是否在一条原型链上)
console.log(arr instanceof Array)//返回值为布尔
数组可以为数组或者对象 但是对象不能为数组

再分类
数组和对象统一为为引用类型

三、作用域问题

var str = 'xxxxxx';//全局(顶级)->所有区域都可使用
function memeda(){
    var str2 = "yyyyy";//二级变量 作用域在memeda内部
    console.log(str);
    function heheda(){
        console.log(str);
        console.log(str2);
    }
    heheda();
    console.log(str2);
}
memeda();
作用域链:作用域的生效区间由外到内延申 形成的作用域区间

四、函数闭包(也就是内嵌函数)

function son(){
    var num = 1//二级变量初始值
    function getNum(){
        num++;
        return num;//将num的值反出去
    }
    return getNum;//将内部嵌套的函数反出去
}
var getnums = son();//代理到了内部嵌套函数
console.log(getnums());//第一次 2 
console.log(getnums());//第二次 3 
console.log(getnums());//第三次 4 
var num = getnums()//第四次 5
console.log(num)//5
num = null //手动销毁(置空)
console.log(getnums());//第五次 null 
普通变量:用完被GC回收 
闭包后的变量:保存在内存中 不被销毁 可以动态获取到局部变量的值

过多的使用闭包会导致内存泄露,可以手动销毁(避免内存泄漏)也就是手动置空

五、自调函数

var pras = "tom";
(function(val){
    console.log('hello'+val);
})(pras)
永远自动执行一次 在闭包可以被完美解析

六、闭包和自调函数应用场景

已知页面有诺干个 li 标签 点击每一个弹出相应的下标

for(var i = 0; i<lilist.length;i++){
    (function(){//自调函数
        var id = i;//将i重新赋值给id 保存当前i的值 之后与i无关
        lilist[i].onclick=function(){
            alert(id);//弹出上面保存过的i的值
        }
    })()
}
es6 可以用let声明解决

七、变量提升

在 js 中 变量的声明是最优先的 赋值之类的操作按照正常程序从上至下
var 没有块级作用域 可以变量提升 let 有块级作用域 不存在提升

变量在使用过程中会使用就近原则
var memeda = 'xxxxxxx';
function heheda(){
    console.log(memeda);//打印underifend  因为它最近作用域在函数内部 而函数内部只申明了还没有赋值
    var memeda = '100';
    console.log(memeda)
}

八、JS 面向对象

本质就是构造函数


 var obj = {};
//创建对象 封装构建函数 不能直接调用!需要通过new关键字
function User(userName,sex){
    this.userName = userName;
    this.sex = sex;
    this.dosomething = function(){
        console.log('i can singing....');
    }
}
//调用
var stu = new User('么么哒','女');
console.log(stu.userName);
prototype	显示原型 只有构造函数才具有 也是一个对象 具有隐式原型
_proto_	隐式原型 只有对象才具有 
constructor	所有对象都具备该属性 指向构造函数

一个对象的 proto 指向其构造函数的 ptototype 既 User().proto == User.prototype

有了显示原型才有隐式原型

所有的隐式原型都不可用,一般用到的方法都是在用底层构造函数的显示原型,因为隐式原型继承的是构造函数的显示原型。所有对象的构造函数(原型)都是Object() object 的父构造函数为空。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值