我是靠谱客的博主 阔达云朵,最近开发中收集的这篇文章主要介绍JavaScript练习题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第1部分,JS核心技术测试

1. 如下代码输出的结果是什么 

console.log(1+ "2"+"2");//1
console.log(1+ +"2"+"2");//2
console.log("A"- "B"+"2");//3
console.log("A"- "B"+2);//4

A.122 122 NaN NaN

B.122 32 NaN NaN2

C.122 32 NaN2 NaN

D.122 32 NaN2 NaN2

解析:C

      字符串的拼接,+一侧出现字符串为拼接,3,4字符串隐式转数字为NaN,NaN加任何数都为 NaN

单目运算符:其他类型转成数字

双目运算符: 优先考虑字符串拼接

2. 声明一个对象,给它加上 name 属性和 show 方法显示其 name 属性值,以下代码中正确的是()  

A.var obj = [name:"zhangsan",show:function(){alert(name);}];

B.var obj = {name: ' zhangsan' ,show:' alert(this.name)'};

C.var obj = {name: ' zhangsan' ,show:function(){alert(name);}};

D.var obj = {name:' zhangsan',show:function(){alert(this.name);}};

解析:D

        A:应该为花括号,B:在普通方法调用中this指向全局无法显示,C:name沿作用域往上找为全局,全局有一个name为空所以显示空而不是报错。

3.  请选择结果为真的表达式: ()  

A.null instanceof Object

B.null === undefined  

C.null == undefined

D.NaN === NaN

解析:D

         A:查看左边对象是否是右边的构造函数实例出来的对象,B:===比较的是数据类型和数      值,D:NaN和任何数都不等包括它自身

4.  var arr=[a,b,c,d];数组arr中元素都是整数,下面能得到最大整数的是?

AMath.max(arr)    //NaN

BMath.max(arr[0], arr[1], arr[2], arr[3])  

CMath.max.call(Math, arr[0], arr[1], arr[2], arr[3])  

DMath.max.apply(Math,arr)

解析:BCD

        Math方法的使用A:NaN   数组不能比要散的数据,   B:基本用法    

  C:第一个参this指向,与B类似,  D:Math.max.apply(Math,[]) 第一个参this指向

修改this指向   call直接传参    apply需打包为对象  bind需自己调用

1call----->.obj.say.call(obj2,18,boy)

2apply----->.obj.say.apply(obj2,[18,boy])

3bind----->.obj.say.bind(obj2,18,boy)()

5. typeof(null)打印结果是?  

解析 :object

         typeof用于查看数据的数据类型  NaN属于number类型,Boolean属于function,string,undefined

6.基础数据类型有哪些?引用数据类型有哪些?区别是什么? 

解析:基本数据类型:Number, string, null, undefined, boolean  symbol  bigint(数字有上限和下限bingint可以无限大) 表现直接加n  console log (123n);

          引用数据类型:数组,对象,函数,JSON

区别:1.存储上:基本数据类型在栈内存中,引用在堆内存中,2.比较上:基本是数值的比较,引用是地址的比较 3.赋值上:相同变量赋值时基本值改变不影响另一个,引用改一个都变

7.如何删除对象的指定属性 

解析:delete 对象.属性

        用let声明的变量不能被删除,没有let的就可以删除,即  可删除浏览器创建的对象

        可以删除对象里自身的属性成功true,失败false

        在严格模式删除变量会报错,

8. 写一个求和的函数sum,达到下面的效果  

// Should equal 15
sum(1, 2, 3, 4, 5);
// Should equal 0
sum(5, null, -5);
// Should equal 10
sum('1.0', false, 1, true, 1, 'A',1, 'B',1,'C,1,'D',1, 'E',1,'F',1,'G', 1);
// Should equal 0.3, not 030000000000000
sum(0.1, 0.2);

function sum2() {
            let result = 0;
            for (let i = 0; i < arguments.length; i++) {
                result += window.parseFloat(arguments[i]) || 0;
            }
            return result.toFixed(3) * 1000 / 1000;

        }
        console.log(sum2(1, 2, 3, 4, 5));
        console.log(sum2(5, null, -5));
        console.log(sum2('1.0', false, 1, true, 1, 'A', 1, 'B', 1, 'c', 1, 'D', 1, 'E', 1, 'F', 1, 'G', 1));
        console.log(sum2(0.1, 0.2));

解析:parseFloat:其他数据类型转数字,toFixed银行家算法(四舍六入五成双),Math.round()只能取到整数,Math.floor()向下取整,Math.ceil向上取整

代码window也可不用写,toFixed后可变为(1)*10/10

9. ==运算符判断相等的流程是怎样的?

解析:如果两个值类型同正常比较,

         不同时

        1.null与undefined相等,

         2.Boolean型与数值比较,把Boolean转为数字true为数字1,false为数字0,

         3字符串与数字,将字符串转为数字.数字开头可转,其他为NaN

         4.如果一个值是对象,另一个是数字或字符串,将对象转为原始值进行比较

         5.NaN不与任何值相等包括他自己

         6.其他情况认为不等

10. 如何实现数组和对象深度复制  

解析:1.先解释什么是深度复制

           2.封装函数实现

深度复制不管多少层都互不影响,

  let obj = [1, [2, [3], { name: "111" }]];
        function clone(obj) {
            // 如果是数组
            var buf;
            if (obj instanceof Array) {
                buf = [];
                let i = obj.length;
                while (i--) {
                    buf[i] = clone(obj[i])
                }
                return buf;
            } else if (obj instanceof Object) {//如果是对象
                buf = [];
                for (let key in obj) {//对象不能随便遍历只能用for in 取出键名
                    buf[key] = clone(obj[key]);
                }
                return buf;
            } else {
                return obj;
            }
        }
        console.log(obj);
        let copyobj = clone(obj);
        console.log(copyobj);
        obj = [1, 2, 3]
        console.log(obj);
        copyobj = { xppll: "2222" }
        console.log(copyobj);

JSON.parse(JSON.stringify(ob2));  也可实现

以下分析浅拷贝及其应用方式

数组对象都适用

         1.将对象转为JSON字符串(无法实现 undefined,function,symbol 这三种类型的数据拷贝,

          2.递归,(函数内部自己调用自己易出现栈溢出)不可拷贝date对象

对象深拷贝:1.Object.assign(),2.es6扩展符(...) 只适用一层深拷贝无法嵌

object1 = [1,2,[3]]
//第一种
let object2 = {...object1} //二维改变会影响
//第二种
let object2= [];
        for (let i = 0; i <object1.length; i++) {
           object2.push(object1[i])
        }
//第三种
let object2 = Object.assign({}, object1)

数组深拷贝:concat(),2.slice()  只适用一维数组,其余为浅拷贝

// 数组的深拷贝
let arr2 = []
arr2 = arr2.concat(arr1);
// 2 
let arr2 = []
arr2 = arr1.slice();

基本类型采用值传递,引用类型采用地址传递。深拷贝--->对于引用类型,不再是只增加一个地址,而是在内存中重新开辟一片存储空间

11. New操作符具体干了什么?  

解析:

1.创建新对象

2.将新对象的_proto_指向构造函数的prototype

3.将构造函数的this指向新对象

4.指向构造函数的代码

5.返回新对象

12. Array(2).join() 结果是()  

解析:

join()将数组转为字符串并默认以拼接

13. x = 1; (function(){return x; var x = 2;}())  返回值是? 

解析:undefined

函数里面的x声明会提升但没赋值所以返回为undefined

14. console.log([1,2] + [3,4]) 打印什么?  

解析:1,23,4

+拼接

算数运算符:除了string类型以外 的其他基本数据类型

True+false

拼接符:当数据为string或引用类型时

如果是引用数据类型,会自动调用自身的toString方法,将其转为原始值

如果调用自身的toString方法得到的不是原始值,会继续调用valueOf方法将其转为原始值,如果获取不到那么报错

15.一句话描述this的指向  

解析:谁调用指向谁

在普通函数中指向window,作为对象的方法调用时谁调用指向谁,作为构造函数调用时指向实列出来的对象,箭头函数指向离他最近的

super作为对象使用时

                 1)在普方法中,super指向父类的原型,super的调用方法中,this指向子类的实例

                 2)在静态方法中,super指向父类,super的调用方法中,this指向子类

16.描述JS的三个组成部分及其含义?

解析:ECMAScript:核心,描述语言基本语法

          Dom:文档对象模型操作页面

          Bom:浏览器对象模型操作浏览器

17. 下面代码运行的结果是什么?  

var bool = !!2;
console.log(bool);//true
var bool = !![];
console.log(bool);//true
var bool = !!{};
console.log(bool);//true

解析:true

          true

          true

 !!将其他数据类型强转为Boolean型

18. 下面程序输出结果是? 

var a = new Object ();
a.value = 1;
b = a;
b.value = 2;
console.log(a.value);//2

 解析:2

对象赋值指向的是同一片地址

19. 下面程序输出结果是? 

for (i=0, j=0; j<6, i<10; i++, j++) {
    k = i + j;
}
console.log(k);//18

解析:18

看最后一个结尾J的判断语句

20.如何检查一个变量是String类型,请写出你知道的所有的方法 ?

解析:1.typeof操作符,

           2.Object.prototype.toString.call()

           Str.__proto__ ,constructor == String;

21.['1', '2', '3'].map(parseInt) 输出什么?并解释  分值3分

解析:[1,NaN,NaN]

['1', '2', '3'].map(parseInt) //parseInt(string【表示字符串】,radix【表示2-36进制】)

[‘1’, ‘2’, ‘3’].map((item,index) =>{
return parseInt(item,index)
});
//执行步骤:
parseInt(‘1’,0)//进制省略或为0,默认以10进制返回结果
parseInt(‘2’,1)//进制小于2或大于36,返回NaN
parseInt(‘3’,2)//按2进制返回但二进制无3,返回NaN

map将返回值放入新的一个数组中

22.描述in和hasOwnProperty的区别  

解析:hasOwnProperty只能判断是否是属于自身的属性,无法找到原型身上的属性(hasOwnProperty()只在属性存在于实例中时才返回true)

in原型身上的属性也能找到(in操作符只要通过对象能访问到属性就返回true)

23. 描述typeof和instanceof的区别  

解析:判断变量类型:Typoof 返回字符串,返回结果为五个基本数据类型加(引用数据类型)object

instanceof来检测某个对象是不是另一个对象的实例

24. 描述substr和substring的区别  

解析: Substr(start,length)

           Substring(start,end)

一个是下标一个是长度

            都为提取字符串的方法

25. 描述Array.slice和Array.splice的区别

解析:都为对数组进行截取

           Slice选取字符串的一部分返回新数组原数组不变

           Splice插入,删除或替换数组元素,元素组改变

26. console.log (!!(new Boolean(false)) 输出什么?  

解析:true

!!将其他类型转布尔值

27.console.log(1&&2);打印什么  

解析:2

&&遇假短路

28. 请根据下面的描述,用JSON语法编写一个对象  

“小明今年22岁,来自杭州。兴趣是看电影和旅游。他有两个姐姐,一个叫小芬,今年25岁,职业护士。还有一个叫小芳,今年23岁,是一名小学老师。”

 <script>
        var persons = {
            "name": "小明",
            "age": 22,
            "from": "杭州",
            "interesting": ["电影", "旅游"],
            "sisters": [{
                    "name": "小芬",
                    "age": 25,
                    "work": "护士"
                },
                {
                    "name": "小芳",
                    "age": 23,
                    "work": "小学教师"
                }
            ]
        }
    </script>

29. 请写出如下代码的打印结果 

function Foo () {
    Foo.a = function () {console.log (1);}
    this. a = function () {console.log (2);}
}
Foo.prototype. a = function () {console.log (3);}
Foo.a = function () {console.log (4);}
Foo.a();//4
let obj = new Foo ();
obj. a ();//2
Foo.a();//1

30. 填写内容让下面代码支持a.name = “name1”; b.name = “name2” 

function obj(name) {

 1

}

obj. 2 = "name2";

var a = obj("name1");

var b = new obj ();

   function obj(name) {
            if (name) {
               let obj = {
                  name
               }
            }
            return obj;
        }
        obj.prototype.name = "name2";
        var a = obj("name1");
        var b = new obj();
        console.log(a.name);
        console.log(b.name);

31使用filter实现数组元素去重

 function a(b) {
            let arr = b.sort();
            arr = arr.filter((item, index) => {
                if (item == arr[index - 1]) {
                    return false
                }
                return true

            })
            console.log(arr);
        }
        let b = [1, 1, 2, 2, 8, 9, 8, 10, 5]
        a(b)
  function unique(arr) {

            var res = arr.filter(function (item, index, array) {
                return array.indexOf(item) === index;
            });

            return res;
        }


        var arr = [1, 1, '1', '2', 1];
        var ans = unique(arr);
        console.log(ans); //[1, '1', '2',]

32. 在数组的原型上实现indexOf方法 

  Array.prototype.addindex = function () {
            var x = 0;
            if (arguments[1]) { //如果有第二个参数
                x = arguments[1] // 让x等于这个参数
                if (arguments[1] < 0) { //如果第二个参数小于1
                    x = this.length + arguments[1] //从倒序开始,例如-2就是倒数第2个 
                }
            }
            for (var i = x; i < this.length; i++) { //从x开始遍历数组 
                if (this[i] == arguments[0]) { //如果在数组中找到了和第一个参数相等的就返回这个索引 
                    return i;
                } else
                if (i == this.length - 1) { //如果找到最后一项还是没有找到,就返回-1 
                    return -1;
                }
            }
        }

        let a = [1, 2, "a"]
        const a1 = a.addindex("a")
        console.log(a1);

        Array.prototype.indexOf = function (a, b = 0) {
            for (let i = b; i < this.length; i++) {
                if (a == this[i]) {
                    return i;
                }
            }
            return -1;
        }

33.打印1000之内的所有对称数  

eg:

 //new Arrar(1001) 创建一个长度为1001的空数组
        let r = Array.from(new Array(1001).keys());
        console.log(r);
        for (let i = 0; i < r.length; i++) {
            if (r[i].toString().split("").reverse().join("") == r[i]) {
                console.log(r[i]);
            }
        }

封装的函数:

 function duichen(start, end) {
            for (var i = start; i < end; i++) {
                var strI = i.toString().split("").reverse("").join("");
                if (Number(strI) == i && i >
                    10) {
                    console.log(strI);
                }
            }
        }
        duichen(1, 1000);
  let duiChen = function (num) {
            let str = '';
            for (let i = 1; i <= 9; i++) {
                for (let j = 1; j <= 9; j++) {
                    if (i == j) {
                        str = str + i + j + i + ',';
                    }
                    /*  str = str + i + j + j + i + ',';  //10000以内 */
                }
            }
            return str;
        }
        console.log(duiChen(1000));

34. 实现数组合并并排序  

请把数组 [A1, A2, B1, B2, C1, C2, D1, D2] 和 [A, B, C, D],合并为 [A1, A2, A, B1, B2, B, C1

, C2, C, D1, D2, D]?

  let arr6 = ["A1", "A2", "B1", "B2", "C1", "C2", "D1", "D2"];
        let arr7 = ["A", "B", "C", "D"];
        let arr8 = [...arr6, ...arr7].sort(
            (v2, v1) => (
                v2.codePointAt(0) - v1.codePointAt(0)
            )
        );

        console.log(arr8);

扩展运算符可改为concat

  let a1 = ["A1", "A2", "B1", "B2", "C1", "C2", "D1", "D2"];
        let a2 = ["A", "B", "C", "D"];
        let a3 = a1.concat(a2)
        a3.sort().sort((a, b) => {
            if (a.charAt(0) == b.charAt(0) && a.length > b.length) {
                return -1
            }
        });
        console.log(a3);

附加:

写一个按照下面方式调用都能正常工作的 sum 函数

 console.log (sum (2,3)); //5

     console.log (sum (2)(3)); //5

然后再写一个按照下面方式调用都能正常工作的 sum 函数

console.log (sum (2,3,4) / 1);// 9

console.log (sum (2)(3)(4) / 1); //9

console.log (sum (1,2)(3,5)(4) / 1); //15

 function sum(a, b) {
            if (b) {
                return a + b;
            } else {
                return function (c) {
                    return a + c;
                }
            }
        }
        console.log(sum(2, 3));

        document.write(sum(2)(3));

 改:reduce 累加运用

 function sum(...arg) {
            let sum2 = arg.reduce((p, i) => p + i, 0);
            let sum3 = function (...arg1) {
                sum2 += arg1.reduce((p, i) => p + i, 0);
                return sum3
            }
            sum3.toString = function () {
                console.log("1111");
                return sum2
            }

            sum3.valueOf = function () {
                console.log("22222");
                return sum2
            }
            return sum3;
        }

        console.log(sum(2, 3, 4) / 1);// 9 
        console.log(sum(2)(3)(4) / 1); //9
        console.log(sum(1, 2)(3, 5)(4) / 1);

 

此题可运行输入其他有弊端

 function sum(num1, num2, num3) {
            if (num2 && num3) {
                return num1 + num2 + num3;
            } else {
                return function sum2(num4, num5) {
                    if (num5) {
                        return function sum3(num7, num8) {
                            if (!num8) {
                                return num1 + num2 + num4 + num5 + num7
                            }
                        }
                    } else {
                        return function sum3(num6) {
                            return num1 + num4 + num6;
                        }
                    }
                }
            }

        }
        console.log(sum(2, 3, 4) / 1);
        console.log(sum(2)(3)(4) / 1);
        console.log(sum(1, 2)(3, 5)(4) / 1); //15

最后

以上就是阔达云朵为你收集整理的JavaScript练习题的全部内容,希望文章能够帮你解决JavaScript练习题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部