js数组操作

Js:判断变量是否为undefined

// 判断变量x是否为undefined
if (typeof(x) == "undefined") {
    alert("x is undefined.")
}
   

nullNull 类型,表示“空值”,代表一个空对象指针,使用 typeof 运算得到 “object”,它是一个特殊的对象值。

undefinedUndefined 类型,当声明了一个变量未初始化时,它的就是 undefined

2、判断变量是否为undefined

if (typeof (a) == 'undefined') { console.log('a 是 undefined'); // 'a 是 undefined' }

3、判断变量是否为null

if(!b && typeof(b) !== 'undefined' && b != 0) { console.log('b 是 null'); // 'b 是 null' }

js获取两个数组及数组对象中相同和不相同的值

1、获取两个数组中相同的元素

   var arr1 = [0,1,2,3,4,5];
   var arr2 = [0,4,6,1,3,9];
   function getArrEqual(arr1, arr2) {
        let newArr = [];
         for (let i = 0; i < arr2.length; i++) {
            for (let j = 0; j < arr1.length; j++) {
                if(arr1[j] === arr2[i]){
                    newArr.push(arr1[j]);
                }
          }
        }
     return newArr;
    }
    console.log(getArrEqual(arr1, arr2));
   //[0, 4, 1, 3]

2、获取两个数组中不相同的元素

 var arr1 = [0,1,2,3,4,5];
 var arr2 = [0,4,6,1,3,9];
  function getArrDifference(arr1, arr2) {
    return arr1.concat(arr2).filter(function(v, i, arr) {
         return arr.indexOf(v) === arr.lastIndexOf(v);
    });
  }
  console.log(getArrDifference(arr1,arr2));

  // [2, 5, 6, 9]
   

3、获取两个数组对象中相同的值


function getArrDifSameValue(arr1,arr2){
    var result = [];
    for(var i = 0; i < arr2.length; i++){
        var obj = arr2[i];
        var id = obj.id;
        var isExist = false;
        for(var j = 0; j < arr1.length; j++){
            var aj = arr1[j];
            var n = aj.id;
            if(n == id){
                isExist = true;
                break;
            }
        }
        if(isExist){
            result.push(obj);
        }
    }
    return result;
}
 
var arr1 = [ {"id": "A"},{"id": "B"}];
var arr2 = [ {"id": "A"}, {"id": "B"},{"id": "C"}];
console.log(getArrDifSameValue(arr1,arr2));

4.获取两个数组对象中不相同的值

function getArrDifSameValue(arr1,arr2){
    var result = [];
    for(var i = 0; i < arr2.length; i++){
        var obj = arr2[i];
        var id = obj.id;
        var isExist = false;
        for(var j = 0; j < arr1.length; j++){
            var aj = arr1[j];
            var n = aj.id;
            if(n == id){
                isExist = true;
                break;
            }
        }
        if(!isExist){
            result.push(obj);
        }
    }
    return result;
}
 
var arr1 = [ {"id": "A"},{"id": "B"}];
var arr2 = [ {"id": "A"}, {"id": "B"},{"id": "C"}];
console.log(getArrDifSameValue(arr1,arr2));
// [{"id": "C"}]

for-in与 for-of有什么区别

*区别1*:遍历输出结果不同
for in循环遍历的是数组的键值(索引),而for of循环遍历的是数组的值
代码例子:

var arr = ['我','你','他','它'];
        for(var key in arr){	
            console.log(key);
        }
        console.log('---------------');
        for(var item of arr){	
            console.log(item);
        }

输出结果:
在这里插入图片描述

区别2:for of无法循环遍历对象

    var obj = {
        A:'我',
        B:'你',
        C:'他',
        D:'它'
    };
        for(var key in obj){	
            console.log(key);
        }
        console.log('---------------');
        for(var item of obj){	
            console.log(item);
        }

输出结果:
在这里插入图片描述

区别三:for in 会遍历自定义属性,for of不会

 ```javascript

var arr = ['我','你','他','它'];
arr.otherVal ='小红';
for(var key in arr){
console.log(key, arr[key]);
}
console.log('---------------');
for(var item of arr){
console.log(item);
}

 ```

输出结果:
在这里插入图片描述

ES6 Object.assign()的用法

​ Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target)。它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象。

let targetObj1 = { a: 1 };
        let sourceObj1 = { b: 1 };
        let sourceObj11 = { c: 3 };
        Object.assign(targetObj1, sourceObj1, sourceObj11);
        console.log(targetObj1);

注:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

let targetObj1 = { a: 1, b: 2 };
        let sourceObj1 = { b: 1 };
        let sourceObj11 = { c: 3 };
        Object.assign(targetObj1, sourceObj1, sourceObj11);
        console.log(targetObj1);

如果只有一个参数,Object.assign会直接返回该参数。

let targetObj1 = { a: 4 }
        Object.assign(targetObj1);
        console.log(targetObj1)

如果该参数不是对象,则会先转成对象,然后返回。

console.log(typeof (Object.assign(2)));

由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。

console.log(typeof(Object.assign(null)));
 
 console.log(typeof(Object.assign(underfind)));

注意:如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象,如果无法转成对象,就会跳过。这意味着, 如果undefined和null不在首参数,就不会报错。其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。

Object.assign只拷贝自身属性,不可枚举的属性(enumerable为false)和继承的属性不会被拷贝。

​ 对于嵌套的对象,Object.assign的处理方法是替换,而不是添加。

```javascript

var target = { a: { b: 'c', d: 'e' } }

var source = { a: { b: 'hello' } }

Object.assign(target, source);
```

上面代码中,target对象的a属性被source对象的a属性整个替换掉了,而不会得到{ a: { b: 'hello', d: 'e' } }的结果。这通常不是开发者想要的,需要特别小心。有一些函数库提供Object.assign的定制版本(比如Lodash的_.defaultsDeep方法),可以解决深拷贝的问题。

注意,Object.assign可以用来处理数组,但是会把数组视为对象。

console.log(Object.assign([1, 2, 3], [4, 5]));

其中,4覆盖1,5覆盖2,因为它们在数组的同一位置,所以就对应位置覆盖了。

Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。

var object1 = { a: { b: 1 } };
 
var object2 = Object.assign({}, object1);
 
object1.a.b = 2;
 
console.log(object2.a.b);

js中的hasOwnProperty()方法

hasOwnProperty()方法用于检测一个对象是否含有特定的自身属性,返回一个布尔值

那么我们来验证一下

	 function Fn() {
	      this.age = 'wm'
	 }
	        Fn.prototype.sex = '女'
	        var obj = new Fn()
	        //  实例化对象会继承构造函数里的属性和方法
	        console.log(obj.hasOwnProperty('age')) // true
	        console.log(Fn.prototype.hasOwnProperty('age')) //false
	        console.log(obj.hasOwnProperty('sex')) // false

javascript search()

search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
如果没有找到任何匹配的子串,则返回 -1。

let str = "abcd Abcd abc"
console.log(str.search("abc"))
运行结果:
0

let str = "abcd Abcd abc"
console.log(str.search("Abc"))
运行结果:
5

上面两个例子发现,search()方法查找时是对大小写敏感的。

如果要忽略大小写:

let str = "abcd Abcd abc"
console.log(str.search(/Abc/i))
运行结果:
0

JS中filter过滤数组

  1. filter()方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
  2. 不会改变原数组
  3. return后面判断结果,取布尔值,true的话就添入新的filter数组中,false的话,不会添进filter的数组中
    var arr = [1,2,'',3,' '];
    var arr2=arr.filter(function (item) {
        return item;
    });          //[1,2,3,' ']

例:筛选不包含'b'的字符串

    var arr = ['aa','cb','cc', 'bd','rf']
    var newArr = arr.filter(item => item.indexOf('b')<0)   //["aa", "cc", "rf"]

indexOf的用法

indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。

注释:indexOf() 方法对大小写敏感!

注释:如果要检索的字符串值没有出现过,则该方法返回 -1。

常用于数组去重:

	var num=[1,2,2,2,3,4,5,5,6,6,7,8];
	var num1=[];
        for(var i=0; i<num.length; i++){
	if(num1.indexOf(num[i])<0){
		num1.push(num[i]);
	      }
	    }
        console.log(num1);

js中 splice() 方法

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

语法: arrayObject.splice(index,howmany,item1,.....,itemX)

参数 描述
index 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX 可选。向数组添加的新项目。

实例:

// 实例:
var s=['a','b','c'];
console.log(s.splice(2,1)); // 打印["c"]
console.log(s); // 打印["a", "b"]
 

自己理解:
s.splice(2,1) ,从下标2的位置截取1个元素,即 ["c"]

s 则为剩下的元素:即 ["a", "b"]

手写深拷贝等方法

// 深拷贝函数
    // 深拷贝实现方式JSON.parse(JSON.strinfy(obj)), 但是没法复制函数(会返回null)
    export function cloneDeep(obj){
        //  想判断是否是对象类型,是否空对象类型
        if(typeof obj !== 'object' || obj === null){
            return obj;
        }
        let data ;
        // 进一步判断是数组还是对象
        if(obj instanceof Object){
            data = {}
        }
        if(obj instanceof Array){
            data = [];
        }
        for(let v in obj){
            let childData = obj[v];
            data[v] = typeof childData === 'object' ? cloneDeep(childData) : childData;
        }
        return data;
     }
 
 
    // 防抖函数,防止短时间内大量请求,在规定时间间隔内再次发起请求的话就继续重新计时
    export function debounce(fn,wait){
        let timeOut = null;
        return function(){
            let context = this;
            let args = arguments;
            if(timeOut) clearTimeout(timeOut);
            timeOut = setTimeout(() => {
                fn.apply(context,args);
            }, wait)
        }
    }
    
    // 节流函数,减少调取次数,在规定时间内仅执行一下
    export function throttle(fn, wait){
        let timeID = null;
        return function(){
            let context = this;
            let args = arguments;
            if(!timeID){
                timeID = setTimeout(()=> {
                    timeID = null;
                    fn.apply(context,args)
                },wait)
            }
        }
    }
 
 
 //  冒泡排序
    export function bubbleSort(arr){
        for(let i = 0; i < arr.length; i++){
            let count = 0;
            for(let j = 0; j < arr.length; j++){
                if(arr[j + 1] < arr[j]){
                    count++;
                    let temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
            if(count === 0) break;
        }
        return arr;
    }
 
    // 选择排序,每一次循环都是为了找出剩余数组中最小的数值
    export function selectSort(arr){
        for(let i = 0; i < arr.length - 1; i++){
            let minIndex = i;
            for(let j = i + 1; j < arr.length; j++){
                if(arr[j] < arr[minIndex]){
                    minIndex = j;
                }
            }
            let temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
        return arr;
    }
 
    // 手动实现call、apply、bind方法
    Function.prototype.myCall = function (context) {
        if(typeof this !== 'function'){
            throw new TypeError('Error')
        }
        context = context || window;
        context.fn = this;
        const args = [...arguments].slice(1);
        const result = context.fn(...args);
        delete context.fn;
        return result;
    }
 
    Function.prototype.myApply = function (context) {
        if(typeof this !== 'function'){
            throw new TypeError("Error")
        }
        context = context || window;
        context.fn = this;
        const args = arguments[1];
        const result = context.fn(...args);
        delete context.fn;
        return result;
    }
 
    Function.prototype.myBind = function (context){
        if(typeof this !== 'function'){
            throw new TypeError("Error")
        }
        const _this = this;
        const args = [...arguments].slice(1);
        return function F(){
            if(this instanceof F){
                return new _this(...args,...arguments)
            }
            return _this.apply(context, args.concat(...arguments))
        }
    }

substr()的用法

在这里插入图片描述

hasOwnProperty和Object.getOwnPropertyNames

① hasOwnProperty:检测属性是否存在对象实例中(可枚举属性),如果存在则返回true,不存在则返回false

  注意:此方法无法检查该对象的原型链中是否具有该属性

  使用方法:obj.hasOwnProperty(key);

② Object.getOwnPropertyNames:返回对象自己的属性的名称,是一个数组。(包括可枚举的和不可枚举的属性)

一个对象的自己的属性是指直接对该对象定义的属性,而不是从该对象的原型继承的属性。

对象的属性包括字段(对象)和函数。

使用方法:Object.getOwnPropertyNames(obj);

举个栗子:

找出对象 obj 不在原型链上的属性
1、返回数组,格式为 key: value(冒号后面还有一个空格)
2、结果数组不要求顺序

解答一:使用hasOwnProperty

function iterate(obj) {
var arr = [];
//用for in 对obj对象的属性进行遍历
for(var key in obj){
if (obj.hasOwnProperty(key)){ //hasOwnproperty返回对象实例中的属性
arr.push(key + ": " + obj[key]);
}
}
return arr;
}

解答二:使用Object.getOwnPropertyNames

function iterate(obj) {
var result = Object.getOwnPropertyNames(obj); //返回一个数组,包含对象实例属性的名称
var l = result.length;
//遍历result数组,按要求输出结果
for(var i = 0; i < l; i ++){
var name = result[i];
result[i] = result[i] + ": " + obj[name]; //把“属性: 值”赋给result
}
return result;
}

posted @ 2021-06-18 16:16  三七66  阅读(121)  评论(0)    收藏  举报