基本数据类型有哪些?
- boolean
- string
- number
- undefined
如何检测基本数据类型?
var str=“hello”;
console.log(typeof str)//返回值string
引用数据类型(复合数据类型)有哪些?
1、Array 2、Function 3、Number 4、String 5、Error 6、Rex 7、Math 8、Date
如何检测对象的类型?
1、object.prototype.toString.call(对象名)//获取对象的类型 2、对象名 instanceof 对象类型 //检测该对象是不是指定的类型 3、对象名.construsctor //检测该对象的构造函数
== 和 === 的区别
1、对于string,number等基础类型,==和===是有区别的
1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等
2)同类型比较,直接进行“值”比较,两者结果一样
2、对于Array,Object等高级类型,==和===是没有区别的
进行“指针地址”比较
3、基础类型与高级类型,==和===是有区别的
1)对于==,将高级转化为基础类型,进行“值”比较
2)因为类型不同,===结果为false
null和undefined的区别
ull和undefined的区别
1、首先是数据类型不一样
console.log(typeof null) //object
console.log(typeof undefined) //undefined
2、null和undefined两者相等,但是当两者做全等比较时,两者又不等。(因为他们的数据类型不一样)
console.log(typeof null) //object
console.log(typeof undefined) //undefined
3、转化成数字不同
console.log(Number(null)) //0
console.log(Number(undefined)) //NaN
console.log(Number(22+null)) //22
console.log(Number(22+undefined)) //NaN
4、null代表“空”,代表空指针;undefined是定义了没有赋值
var a;
console.log(a);//undefined
var b=null;
console.log(b);//null
操作数组的方法由哪些?
- push(添加的元素)
- unshift(添加的元素)
- pop()不用写参数
- shift()不用写参数
- delete 数组名(index)只删除元素,会保留位置
- concat()写要合并的数组
- resever()数组顺序倒置,不会生成新数组
- indexof(数组内的元素)
- sort(function(a,b){a-b})升序 sort(function(a,b){b-a})降序
- toString()
- join()不要分割符,就只在()里写一个双引号,千万不要空格,空格也是分隔符。作用:将数组转换成字符串,可以自定义分隔符
- slice(index,截取长度)
- splice(index,截取长度,插入元素1,插入元素2...)
- forEach(function(value,index,arr){})循环遍历数组
- map(function(value,index,arr){})对数组的映射,返回值是和数组一样长度的数组,符合条件的返回相应结果,不符合条件的返回undefined
- filter(function(value,index,arr){})对数组元素进行过滤,返回值是符合条件的元素组成的数组
- randuce(function(prev,value,index,arr){},int)更新移动数据,prev作为函数的返回值,第一次函数没有返回值,就把int作为函数的第一次返回值,没穿int,就把数组第一个元素作为返回值
数组排序的方式
冒泡排序
var arr=[23,56,8,9,3];
for(var i=0; i<arr.length-1; i++){//控制循环次数
for(var j=0; j<arr.length-1-i; j++){//控制俩俩元素对比
if(arr[j]>arr[j+1]){
var m=arr[j];
arr[j]=arr[j+1];
arr[j+1]=m;
}
}
}
document.write(arr+"<br>");
选择排序
for(var i=0; i<arr.length; i++){//控制循环次数
for(var j=i+1; j<arr.length; j++){//每循环一次,得到一个最大数
if(arr[i]>arr[j]){
var m=arr[i];
arr[i]=arr[j];
# arr[j]=m
}
}
}
console.log(arr)
操作节点的方法
- appendChild(node)
- insetBefore(node)
- remove()想删除谁,就找到它,添加该方法
- removeChild(node)删除子节点
- pelaceChild(新节点,被替换的节点)
- hasNodechilds()//判断是否有子节点,有的话结果返回true,没有返回false
- cloneNode(true/false)true深复制,不仅复制节点本身,还复制里里面所有的子节点包括文本,false相当于复制一个空标记
更改相关节点的方法
更改为父节点
- parentNode()找到所有父节点
- parentElement()(IE9以下不支持) 更改子子节点
- firstChild()找到第一个子节点(包含文本节点)
- lastChild()找到最后一个子节点(包含文本节点)
- firstElementChild()找到第一个元素子节点
- lastElmenetChild()找到最后一个元素子节点
- childeNodes()找到所有子节点(包含文本节点)
- children()找到所有元素子节点 更改为兄弟节点
- nextSibling()找到下一个兄弟(包含文本节点)
- previousSibling()找到上一个兄弟(包含文本节点)
- nextElementSilbing()找到下一个紧挨着的兄弟节点
- previousElemenSibling()找到上一个紧挨着的兄弟节点
事件委托原理
利用事件冒泡的原理,把事件绑定在父元素或祖先元素身上,触发执行效果。
事件流的理解
- 网景公司定义了事件捕获的处理方法:从最外层document一层一层向里去找
- 微软公司定义了事件冒泡的方法:从最里面向外每个元素接收到事件,最后接收的是document
- 冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发
- 捕获型事件:事件从最不精准的对象(document对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)
如何阻止默认动作和事件冒泡?
阻止超链接自动跳转默认动作<a href="javascript:;">
2.阻止冒泡用事件监听,传第三个参数 dom.addEventListener("事件名",function(){},true) 2. stopPropagation 想让谁不冒泡,就把该方法加在这个对象身上
如何判断设备的操作系统
利用appVersion
var info=navigator.appVersion.toLowerCase();
console.log(info)
//5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko)
//chrome/102.0.0.0 safari/537.36
if(info.indexOf("window")!=-1){
alert("这是window系统");
}
if(info.indexOf("iphone")!=-1 || info.indexOf("ipad") !=-1){
alert("这是ios系统");
}
if(info.indexOf("android")!=-1){
alert("这是安卓系统");
}
什么是变量提升?
变量提升是我们先输出这个变量,然后再创建并赋值,这时候会把变量的声明进行提升,不会把赋值这一步提升。
造成变量提升的本质原因:
是因为JavaScript引擎在代码执行前回一个解析的过程,创建执行的上下文,初始化一些代码在执行时所需要使用的对象。在访问一个变量时,会在当前的执行上下文中的作用域中去查找,然而作用域的首端指向的是当前执行的上下文中的变量,这个变量是当前执行上下文的一个属性,这个变量包含了函数的形参,所有的函数和变量的声明,这个变量就会在代码解析的时候进行创建。
那么为什么会有变量提升
1 : 提高性能 因为在代码执行会进行一次代码检查和预编译(只进行一次),这样就不需要在函数变量每次执行的时候都再进行一次代码检查和重新解析。 2: 容错了提升