牛客网刷题新知

1、var 赋值 变量的作用域

var a = 1,b = 1;//这种情况在函数中赋值 a,b都是局部的 相当于var a = 1,var b =1;

var a = b = 1;//这种函数中赋值的情况是 a是局部的,b是全局的 相当于 b = 1; var a = b;

2、js数组常用的几种方法(是否改变原数组)

  • 基本的操作方法(增删改查,会改变原数组)
    //push unshift(增 尾插 头插)
    
    //pop shift (删 尾删 头删)
    //基本增删改查
    let arr = [1, 2, 3, 4, 5, 6];
    arr.push(7);
    console.log(arr, 'arrPush'); //[1, 2, 3, 4, 5, 6, 7]
    arr.unshift(0);
    console.log(arr, 'arrUnshift'); //[0, 1, 2, 3, 4, 5, 6, 7]
  • 合并数组 concat ()(不会改变原数组,生成新的数组)
    //concat合并数组
    let arr1 = [1, 2, 3];
    let arr2 = [4, 5, 6];
    let arr3 = arr2.concat(arr1);
    console.log(arr1, arr2, arr3, 'arrConcat'); //(3) [1, 2, 3] (3) [4, 5, 6] (6) [4, 5, 6, 1, 2, 3] 'arrConcat'

  • 删除数组指定元素 splice() ;从数组添加/删除项目,并返回删除的项目;(改变原始数组);

  • 语法:array.splice(index, howmany, item1, ....., itemX);

    index:必需。整数,指定在什么位置添加/删除项目,使用负值指定从数组末尾开始的位置。

    howmany:可选。要删除的项目数。如果设置为0,则不会删除任何项目。

    item1,... ,itemX:可选。要添加到数组中的新项目。

    let arr4 = ['name', 'age', 'gender'];
    arr4.splice(1, 0, 'gtt'); //name项目后添加名称gtt
    console.log(arr4, 'arrSpliceAdd'); //(3) ['name', 'gtt', 'age','gender'] 'arrSpliceAdd'
    
    arr4.splice(3, 1); //删除gender项目
    console.log(arr4, 'arrSpliceDel'); //(3) ['name', 'gtt', 'age'] 'arrSpliceDel'

  • slice(start,end)可以从已有的数组中返回选定的元素;      

array.slice(start,end);

该方法提起字符串的某个部分,并以新的字符串返回被提取的部分。

slice() 方法不会改变原始数组;

start:可选。规定从何处开始选取。若改参数为负数,则表示从数组的倒数第几个元素开始提取。slice(-2)从数组中的倒数第二个元素到最后一个元素。

end:可选。规定从何处结束,slice(-2,-1)标识提取了原数组中的倒数第二个元素到最后一个元素(不包括最后一个元素,也就是只有倒数第二个元素);

//slice截取数组中选定的元素
        var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
        var myBest = fruits.slice(-3, -1);
        console.log(myBest, 'sliceArr');  // ['Lemon', 'Apple'] 'sliceArr'

!!注意区分slice()和splice()方法;

slice:英文释义:切片,裁

splice: 拼接    删除/添加元素拼接成新的数组


  • split()和join()方法
    var str = "How are you doing today?";
    var n = str.split(" ");
    console.log(n, 'slpit');//(5) ['How', 'are', 'you', 'doing', 'today?'] 'slpit'
    
    var stringVal = n.join(',');
    console.log(stringVal, 'stringVal');//How,are,you,doing,today? stringVal
     
  • sort();对数组中的元素进行排序(该方法改变原数组);
     //sort()
            let arrSort = ["Banana", "Orange", "Apple", "Mango"];
            let newArr = arrSort.sort();
            console.log(newArr, 'newArr');//(4) ['Apple', 'Banana', 'Mango', 'Orange'] 'newArr'

3、错题知识点

执行一下程序后,X的值为();
var x = 0;
switch(++X){
    case 0: ++X;
    case 1: ++X;
    case 2:++X;
}

// A:1  B:2  C:3  D:4


需要考虑到switch的case中并没有break,所以结果为C
//下面判断对象myObj是否存在的写法错误的是()

A: typeof myObj == "undefined"
B: myObj === undefined
C: myObj === null
D: !this.hasOwnProperty('myObj')


//答案选择C

//解析:
//前提是myobj是一个对象,只是存在与不存在的问题,几种表示方法:
//1、!obj
//2、!window.obj
//3、typeof myObj == "undefined(判断对象是否有定义,已定义未赋值,返回true)
//4、myObj == undefined(已定义未赋值。返回true)
//5、myObj === undefined (已定义未赋值,返回true)
//6、!this.hasOwnProperty('myObj'))(判断是否为顶层对象的一个属性)
//7、myobj == null(注意null与undefined的区别,ull指的是已经赋值为null的空对象,即这个对象实际上是有值的,而undefined指的是不存在或没有赋值的对象。)
//以上几种都正确,但是我用的最多争议最少的是第三种



//判断对象是否为空的方法;

//1、将json对象转化为json字符串,在判断该字符串是否为“{}”
var data = {};
var b = (JSON.stringify == "{}");
alert(b);//true


//2、for in循环判断

var obj = {};

var b = function(){
    for(var key in obj){
        return false
    }
    return true
}
alert(b);//true


//3、Object.getOwnPropertyNames()方法获取对象中的属性名,存到一个数组中,返回数组对象,我们可以通过判断数组的length来判断对象是否为空

var data = {};
var arr = Object.getOwnPropertyNames(data);
alert(arr.length == 0);//true

//4、使用ES6的Object.keys()方法,返回值也是对象中属性名组成的数组

var data = {};
var arr = Object.keys(data);
alert(arr.length == 0);//true


let data = {
      'name': 'gtt',
      "age": 10
}
let arr = Object.keys(data);
console.log(arr, 'arr'); //(2) ['name', 'age'] 'arr'

let arr1 = Object.getOwnPropertyNames(data);
console.log(arr1, 'arr1'); //(2) ['name', 'age'] 'arr1'

4、以下程序执行后返回的结果是()

var p1 = {
  name:'小明',
  age:'12',
  action:function(where,doing){
   console.log(this.age + '岁的'+this.name + '在' + where + doing);
  }  
}
var p2 = {
  name:'小红',
  age:'15'
}
console.log(p1.action.call(p2,'操场上','运动'))//15岁的小红在操场上运动

拓展解析:call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象;

第二个参数的区别:

call的参数是直接放进去的,第二第三第n个参数全都用逗号分隔,直接放到后面 obj.myFun.call(db,'成都', ... ,'string' );

apply的所有参数都必须放在一个数组里面传进去 obj.myFun.apply(db,['成都', ..., 'string' ]);

bind除了返回是函数以外,它 的参数和call 一样。 

参考链接

 

 5、js 中的exec()方法

exec() 方法用于检索字符串中的正则表达式的匹配。

如果字符串中有匹配的值返回该匹配值,否则返回 null

var str1 = new RegExp("e");
document.write(str1.exec("hello"));

// 以上代码输出的结果为();
// A:e  B:null C:TRUE  D:其他几项都不对

//正确答案 A 

6、同步&&异步

以下代码执行后,console.log输出的信息是?

for(var i = 0;i<5;i++){
        requestAnimationFrame(()=>console.log(i));
} 

 答案:5 5 5 5 5

以上主要考察同步与异步的相关知识,同步代码是在主线程中按照从上到下的顺序执行,而异步相当于往任务线程中添加了要执行的任务,当主线程的代码执行完成后就去处理任务进程中的事情;

同步与异步的理解

7、以下js代码输出的是什么?

let A = function() {}
A.prototype.a = 1;
let B = new A();
A.prototype = {
  b: 2,
  c: 3
}
let C = new A();
A.prototype.d = 4;
console.log(B.a);
console.log(B.b);
console.log(C.c);
console.log(C.d);

 解析:

let A = function() {}
A.prototype.a = 1; 
//此时 A.prototype = { a: 1 }


let B = new A(); //此时 B = {}
//在创建B时,已将B._proto_ = A.prototype = { a: 1 }
//即使后面A.prototype重新赋值,将A.prototype开辟了新的空间指向别的对象
//B._proto_并没有改,还是指向{a:1}这个对象


A.prototype = { //此时 A.prototype = { b: 2, c: 3 }
  b: 2,
  c: 3
}
let C = new A(); //C = {}
A.prototype.d = 4;//此时A.prototype = { b: 2, c: 3, d: 4 }

console.log(B.a); //1
console.log(B.b); //undefined
console.log(C.c); //3
console.log(C.d); //4

//C.d
//着重区分: A.prototype.d = 4 和 A.prototype 重新赋值 不是一个概念 
//A.prototype重新赋值时,A.prototype已经指向另一个对象了   
//A.prototype.d = 4时,访问的还是同一个A.prototype 对象 

 8、进制之间的转换

参考链接

0xff^33的结果是:

// ^异或操作
0xff  1111 1111  (255)
      0010 0001(33)
异或操作     
      1101 1110(222)

9、构造函数的考察

//执行以下程序,输出结果为()

function Person(age){

       this.age = age;

 }

Person.prototype = {

       constructor:Person,

       getAge:function(){

            console.log(this.age);

        },

 }

var ldh = new Person(24);

Person.prototype.age = 18;

Object.prototype.age = 20;

ldh.getAge();

 答案解析:

function Person(age) {
    this.age = age;
}
Person.prototype = {
    constructor: Person,
    getAge: function () {
        console.log(this.age);
    },
}
var ldh = new Person(24);  //ldh = { age: 24 }
Person.prototype.age = 18; 
// Person.prototype = { 
//                   age: 18 ,
//                   getAge: function () {
//                        console.log(this.age);
//                   },
//}
Object.prototype.age = 20; // Object.prototype = { age: 20 }
ldh.getAge(); //ldh这个对象上没有getAge方法,就去构造函数的原型上找
              //继承构造函数的原型上的getAge这个方法,this指向的是实例化对象ldh

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值