JS测试题

1.js几种数据类型?值类型?引用类型?
数据类型:string,number,boolean,null,undefined,object
值类型:string ,number ,boolean ,undefined
引用类型: function,array,object
2.声明函数作用和变量作用提升?两者有什么区别?
函数作用是指在函数内声明的所有变量在函数体内始终是有定义的,也就是说变量在声明之前已经可用,所有这特性称为声明提前,即JavaScript函数里的所有声明(只是声明,但不涉及赋值)都被提前到函数体的顶部,而变量赋值操作留在原来的位置。
函数声明提升,函数声明function (整体)会被提前到顶部。而变量声明提升:是一个变量的声明也将提升到顶部,而变量的赋值依然保留在原来的位置。
例如:

var hanshu= function(){
    console.log(2);
}
function  hanshu(){
    console.log(1);
}
hanshu();

上述实际变为:

var hanshu;    //变量声明提升
function hanshu(){    //函数声明提升到顶部
    console.log(1);
}
hanshu = function(){    //变量赋值依然保留在原来的位置
    console.log(2);
}
getName();    // 最终输出:2

3.JS如何检测数据类型?几种方式?
typeof 可以用于检测基本类型,但碰到引用类型均返回为object。
instanceof 可以用于引用类型的检测,但对于基本类型是不生效的,另外,不能用于检测null和undefined。返回true或者false
constructor除去null和undefined,constructor能用于检测js的基本类型和引用类型,但当对象的原型更改之后,constructor便失效了。
Object.prototype.toString.call()

var a=[1,2,3];
console.log(typrof a); 	//Array
console.log(instanceof Array);		//true
console.log(a.constructor === Array) ;	//true

4.什么是事件流?事件捕获?或者冒泡?(可以举例说明)
事件流:当一个HTML元素产生一个事件时,该事件会在元素节点与根节点之间的路径传播,路径所经过的节点都会收到该事件,这个传播的过程叫事件流。即元素触发事件时的传播过程,过程分为捕获和冒泡。
事件冒泡:事件由子元素传递到父元素(从里到外)的过程element.addEventListener(event,function(),false)

事件捕获:事件由父元素到子元素(从外到里)传递的过程element.addEventListener(event,function(),true);

5.如何添加一个dom对象到body中?innerHTML和innerText有什么区别?

var divs=document.createElement("div");
body.appenChild(divs);

innerHTML设置或获取标签所包含的HTML+文本信息(从标签起始位置到终止位置全部内容,包括HTML标签,但不包括自身)
innerText设置或获取标签所包含的文本信息(从标签起始位置到终止位置的内容,去除HTML标签,但不包括自身)

6.事件的委托?有什么好处?
事件委托就是利用事件冒泡机制来管理某一类型的所有事件。即:利用冒泡的原理,把事件加到父级上,触发执行效果。
好处:节省资源同时减少了dom操作,提高性能
7.节点类型?如何判断节点类型?(简述常用属性)
节点类型:元素节点(1)属性节点(2)文本节点(3)注释节点(8)。括号内为它的返回值
element.nodeType

console.log(div.nodeType); //输出1,元素节点

8.如何用js检测一个元素是显示还是隐藏?
通过获取元素display属性来实现。
display为none时,则隐藏;block则显示。
9.什么是同步?异步?
同步(Synchronization):任务顺序执行,在上一个任务未执行完成之前,下一个任务必须排队等待执行。
异步(Asynchronous ): 暂时搁置当前任务,等到主线程任务执行完成,再来响应该任务。例如:setTimeout()和setInterval()函数。
10.null和undefined的区别?
null表示"没有对象",即该处不应该有值。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。
11.简述js中this的指向?
在javaScript中,this是动态绑定的,它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。
全局函数中,this指向window。
当函数被作为某个对象的方法调用时,this就是那个对象。
12.拖拽会用到哪些事件?应该注意什么?
ondragstart 事件:当拖拽元素开始被拖拽的时候触发的事件,此事件作用在被拖曳元素上
ondrag 事件:在元素被拖动期间会持续触发该事件
ondragenter 事件:当拖曳元素进入目标元素的时候触发的事件,此事件作用在目标元素上
ondragover 事件:拖拽元素在目标元素上移动的时候触发的事件,此事件作用在目标元素上
ondragleave 事件:拖拽元素在目标元素上移动的时候触发的事件,此事件作用在目标元素上
ondrop 事件:被拖拽的元素在目标元素上同时鼠标放开触发的事件,此事件作用在目标元素上
ondragend 事件:当拖拽完成后触发的事件,此事件作用在被拖曳元素上
13.Js字符串操作函数?
字符串转换:toString()
字符串分隔:split()
字符串替换:replace()
获取字符串的长度:length
查询字符串:indexOf(); 返回字符串中一个子串第一处出现的索引(从左到右搜索),若没有找到则返回 -1 。
查找给定位置的字符:charAt()
字符串匹配:match()
字符串连接:concat()
字符串切割和提取:
slice() 可以为负数,如果起始位置为负数,则从字符串最后一位向前找对应位数并且向后取结束位置,如果为正整数则从前往后取起始位置到结束位置。
substring()只能非负整数,截取起始结束位置同slice()函数一致。
substr()与第一、第二种函数不同,从起始位置开始截取,结束位置为第二个参数截取的字符串最大长度。
以上三种函数未填第二参数时,自动截取起始位置到字符串末尾。

字符串小写转换:toLowerCase()
字符串大写转换:toUpperCase()
字符串去空格:trim(); 用来删除字符串前后的空格
14.如何理解闭包?可以大量使用吗?为什么?
闭包(closure):外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象。即闭包就是能够读取其他函数内部变量的函数。
不能大量使用,因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包
15.简述什么是内存泄露?(可以举例说明)
简单地说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。
例如:不需要用的监听未移除会发生内存泄露
16.什么是js垃圾回收机制?

标记清除:这是javascript中最常用的垃圾回收方式。当变量进入执行环境是,就标记这个变量为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到他们。当变量离开环境时,则将其标记为“离开环境”。垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后。垃圾收集器完成内存清除工作,销毁那些带标记的值,并回收他们所占用的内存空间。
引用计数:另一种不太常见的垃圾回收策略是引用计数。引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。当这个引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。这样,垃圾收集器下次再运行时,它就会释放那些引用次数为0的值所占的内存。
17.如何合并两个数组,去掉重复的并排序?

	var arr1=[1,3,9,2,2];
    var arr2=[4,3,8,2,5];
    var array=arr1.concat(arr2);
    var newarr=[];
    hanshu();
    function hanshu() {
        for(var i=0;i<array.length;i++){
            for(var j=0;j<array.length;j++){
                if(newarr.indexOf(array[j])==-1){
                    newarr.push(array[j]);
                }
            }
        }
        console.log(newarr.sort());//[1, 2, 3, 4, 5, 8, 9]
    }

18.找出1-100中所有的素数?

	function sushu(num) {
        for (var i = 2; i <= num; i++) {
            //当前的数 是不是素数
            var isactive = false;
            for (var k = 2; k < i; k++) {
                if (i % k == 0) {
                    //不是素数
                    isactive = true;
                }
            }
            //输出素数
            if (!isactive) {
                console.log(i);
            }
        }
    }
    sushu(100);

19.将12345678转化成RMB格式:12,345,678

	var money=1234567.12;
    changemoney(money);
    function changemoney(num) {
        num=num.toFixed(3);
        num=parseFloat(num);
        num=num.toLocaleString();
        console.log(num);
    }

20.判断数组中是否有两个数之和

	var arr=[6,4,3,2,1,7,4];
    var num=8;
    hanshu(arr);
    function hanshu(f) {
        for(var i=0;i<f.length;i++){
            var shu=num-f[i];
            var index=f.indexOf(shu);
            if(index!=i&&index!=-1){
                console.log(f[index], f[i]);
            }
        }
    }

21.原位反转?

	var str="I am the good boy";
    console.log(str.split(" ").reverse().join(" ").split("").reverse().join(""));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值