博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原生js
阅读量:7044 次
发布时间:2019-06-28

本文共 5437 字,大约阅读时间需要 18 分钟。

hot3.png

<!DOCTYPE html>

<html>
<head>
    <title>学习</title>
</head>
<body>

</body>

<script type="text/javascript">
    //遍历数组
    /*var arr = [1,3,4,5,556];
    for(var i = 0; i < arr.length; i ++){
     console.log(arr[i])
    }*/

    //遍历对象

    /*var obj = {
        name: "lin",
        age: "10"
    }
    for(var prop in obj){
        console.log(prop + ":" + typeof(prop))
    }*/

    //遍历自身,不包括原型链上的对象

    /*var obj = {
        name: "lin",
        __proto__: {
            lastName: "aa"
        },
        age: "10"
    }
    for(var prop in obj){
        //如果不使用hasOwnProperty,就会连原型链上的属性都打印获取了
        console.log(obj[prop])//这里直接打印会连原型链的也打印了
        if(obj.hasOwnProperty(prop)){
            console.log(obj[prop])
        }
    }*/

    //in操作符 判断name是不是obj对象的一个属性
    /*var obj = {
        name: "ddd"
    }
    console.log('name' in obj);//返回true
    console.log('name1' in obj);//返回false*/

    //instanceof操作符 A instanceof B 

    /*A 是不是B构造函数构造出的A对象 

    function Person(){}

    var person = new Person();
    console.log(person instanceof Person)//返回true
    console.log([] instanceof Array)//返回true
    console.log({} instanceof Object)//返回true*/

    //区分obj是数组还是对象的三种方法
    /*var obj = {}
    console.log(obj.constructor)//Object
    console.log([] instanceof Array) //true
    console.log(obj instanceof Object) //true
    
    var arr = [];
    var obj = {};
    Object.prototype.toString = function(){

    }

    obj.toString()
    console.log(Object.prototype.toString.call([]))*/

    //,号运算符 返回第二个

    /*var num = (1,3);
    console.log(num)
    
    console.log(undefined == null)//返回true
    console.log(undefined == NaN)//返回false*/
    
    //封装isNaN()函数
    /*function isNaN(num){
        var ret = Number(num);
        ret += "";
        if(ret == "NaN"){
            return true;
        }else{
            return false;
        }
    }
    var dd = 6;
    console.log(isNaN(dd))*/
    
    /*this知识点
    1、函数预编译过程,this指向window
    2、全局作用域里的this指向window
    3、call/apply可以改变函数运行时this指向
    4、obj.function(), function里的this指向obj
    如果new Text()了,this指向本身,如果没有,那就指向window*/
    
    //浅层克隆
    /*function clone(origin,target){
        var target = target || {};
        for(var prop in origin){
            target[prop] = origin[prop];
        }
        return target;
    }
    var obj1 = {
        name: "wo",
        data: [
            {text: "1"},
            {text2: "2"},
        ]
    }
    var obj2 = {
        name: "2wo",
        data2: ["aa","aaa"]
    }
    var obj = {}
    console.log(clone(obj1,obj))
    
    以上方法实现的是原始值的克隆,不适用带有引用值的克隆,因为会发生原始克隆的对象修改时,克隆后的对象也改了.
    obj1.name = "新修改的"
    console.log(clone(obj1,obj))
    console.log(obj1)
    console.log(obj)
    */
    
    
    //深度克隆
    //这样就不会出现你改我也改的状态
    /*var obj1 = {
        name1: "abc",
        data2: ["visa","other"]
    }
    var obj2 = {}
    function deepClone(origin,target){
        var target = target || {};
        var toStr = Object.prototype.toString;
        var arrStr = "[object Array]";
        for(var prop in origin){
            if(origin.hasOwnProperty(prop)){
                if(origin[prop] !== "null" && typeof(origin[prop]) == "object"){
                    //if(Object.prototype.toString.call(origin[prop]) == "[object Array]"){
                    //    target[prop] = [];
                    //}else{
                    //    target[prop] = {};
                    //}
                    target[prop] = toStr.call(origin[prop]) == arrStr ? [] : {};
                    deepClone(origin[prop],target[prop]);//递归
                }else{
                    target[prop] = origin[prop]
                }
            }
        }
        return target;
    }
    deepClone(obj1,obj2);
    console.log(obj1.data2)
    console.log(obj2.data2)
    
    obj1.data2.push("2")
    console.log(obj1.data2)
    console.log(obj2.data2)
    
    总结深度克隆:
    遍历对象,获取自身除原型链的属性值
    判断是引用值还是原始值
    如果是引用值,判断是数组还是对象,如果是数组,新建数组,如果是对象,新建对象
    递归再次自身调用
    return target;
    */
    
    /*数组
    构建数组方式:
    1.对象字面量,var arr = [];
    2.new操作符 var arr = new Array;
    3.var arr = Object.create([])
    
    数组方法:
    一、会改变原数组
    1.push()//最后一位添加东西
    模拟push()方法
    var arr = [1,2]
    Array.prototype.push = function(){
        for(var i = 0; i < arguments.length; i ++){
            this.[this.length] = arguments[i]
        }
        return this.length
    }
    pop()//剪切最后一位
    shift()//剪切第一位
    unshift()//在第一位添加东西
    reverse()//逆转数组
    splice()//从第几位开始,截取多少长度,在切口处添加数据
    sort()//排序
    sort(function(a,b){
        return a - b;//升序
        return b - a;//降序
    })
    
    二、不改变原数组
    concat()//拼接数组
    toString()//把数组转成字符串
    join()//把数组以什么形式转成字符串
    split()//把字符串以什么形式转成数组
    slice()//可传0,1,2参数,从该位截取,截取到该位
    */
    
    /*类数组特点和好处:
    1、属性要为索引(数字)属性,必须有length属性,没有length不叫类数组
    2、是对象又能当数组用的叫类数组
    3、好处:具备数组和对象两种特性,存储数据功能强大*/
    
    /*封装typeof方法:
    typeof(34);//number
    typeof(false);//boolean
    typeof("ddd");//string
    typeof([]);//object
    typeof({});//object
    typeof(null);//object
    typeof(function(){});//function
    typeof(undefined);//undefined
    
    function type(target){
        var temp = {
            "[object Array]": "array",
            "[object Object]": "object",
            "[object Number]": "number-object",
            "[object Boolean]": "boolean-object",
            "[object String]": "string-object"
        }
        var retype = typeof(target);
        if(target === null){
            return "null"
        }else if(retype == "object"){
            var str = Object.prototype.toString.call(target);
            return temp[str];
        }else{
            return retype;
        }
    }*/
    
    /*//数组去重: 原理是把数组的每一位当成对象的属性值,如果没有重复的值,那就给他新增一个值并且push到新数组里面返回,如果有值了就不用重新赋值;this,谁调用指向谁。
    var arr1 = [1,1,3,3,5,5,4,5,8,8];
    Array.prototype.unique = function(arr){
        var obj = {};
        var arr = [];
        for(var i = 0; i < this.length; i ++){
            if(!obj[this[i]]){
                obj[this[i]] = 'a';
                arr.push(this[i])
            }
        }
        return arr;
    }
    console.log(arr1.unique())
    
    //ES6数组去重
    console.log(new Set(arr1))
    */
    
    /*可配置属性和不可配置属性:
    delete 只能删除可配置性的属性
    只要经过var num = 1;声明了,delete就不能通过delete window.num删除
    var a = 1;
    b = 2;
    delete window.a
    false
    delete window.b
    true
    
    (function(x){
        delete x;
        return x;
    })(1)
    */
    
    /*创建对象:Object.create()
    ()里面必须添加一个创建出来的对象,创建出来的对象必须指定这个对象的原型是谁
    var obj = Object.create(demo)
    obj = {
        __proto__:demo
    }
    如果要在obj上找属性,找不到的话,会去他的原型demo上找.*/
    
    /*var div = document.createElement('div');
    document.body.appendChild(div)*/
    
    //字符串去重
    /*var str = "亲亲我我dddd我我我我我我我我我我我我";
    function quchong(str){
        var newstr = "";
        for(var i = 0; i < str.length; i++){
            if(newstr.indexOf(str[i]) === -1){
            //indexOf函数:查找字串中指定字符或字串首次出现的位置,返首索引值。如果找到该字符,则为 返回索引位置;如果未找到,则为 -1。 
            //if(newstr.search(str[i]) === -1){
                newstr += str[i];
            }
        }
        console.log(newstr)
    }
    quchong(str)*/
</script>
</html>

转载于:https://my.oschina.net/parchments/blog/2987414

你可能感兴趣的文章
详见github
查看>>
Vue 2.0 Application Sample
查看>>
二分图匹配之最大匹配——匈牙利算法
查看>>
不要重复发明轮子-C++STL
查看>>
1.Repeater控件
查看>>
windbg使用
查看>>
js中的in-for循环
查看>>
asp.net mvc2网站部署在IIS6的方法
查看>>
android的Activity横竖屏切换时的生命周期
查看>>
图像边界扩展
查看>>
C# JackLib系列之自定义鼠标风格的实现
查看>>
Javascript prototype 及 继承机制的设计思想
查看>>
Unexpected token '...'. Expected a property name.
查看>>
Android app AOP添加埋点技术总结
查看>>
每天学点GDB 4
查看>>
css:鼠标点击出现有颜色的边框?如何解决
查看>>
常用算法Java实现之希尔排序
查看>>
Tiny界面编辑器
查看>>
小程序 wx:for 循环嵌套
查看>>
IE, FireFox, Opera 浏览器支持CSS实现Alpha半透明的方法
查看>>