<!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>