一、js的基本类型有哪些?引用类型有哪些?null和undefined的区别。
基本类型:Number、String、Boolean、Null、Undefined
引用类型:Object / Array / Function / Date / RegExp …
区别:目前,null和undefined基本是同义的,只有一些细微的差别。
null表示”没有对象”,即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。1
2Object.getPrototypeOf(Object.prototype)
// null
undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
1 | var i; |
二、如何判断一个变量是Array类型?如何判断一个变量是Number类型?(都不止一种)
1、判断一个变量是Array类型:
Array.isArray() (IE8之前的版本是不支持的)
Object.prototype.toString: (这种方法在识别内置对象时往往十分有用,但对于自定义对象请不要使用这种方法。)
2、判断一个变量是Number类型:
js正则表达式
typeof()
isNaN()
三、Object是引用类型嘛?引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?
是
基本类型和引用类型,他们是区别是一个有固定空间存在于栈内存中,一个没有固定空间保存在堆内存并且在栈内存中保存了一个指向实现位置的指针。
(1)声明变量时不同的内存分配:
基本类型:存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置。这是因为这些原始类型占据的空间是固定的,所以可将他们存储在较小的内存区域 – 栈中。这样存储便于迅速查寻变量的值。
引用类型:存储在堆(heap)中的对象,也就是说,存储在变量处的值是一个指针(point),指向存储对象的内存地址。这是因为:引用值的大小会改变,所以不能把它放在栈中,否则会降低变量查寻的速度。相反,放在变量的栈空间中的值是该对象存储在堆中的地址。地址的大小是固定的,所以把它存储在栈中对变量性能无任何负面影响。
(2)复制变量值的不同
从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把该值复制到新变量分配的位置上。
从一个变量向另一个变量复制引用类型的值,会把指向存储在堆中的一个对象的指针复制到一个放在新变量分配的空间中。复制结束后,两个变量实际上引用同一个对象。
(3)传递参数的不同
ECMAScript中所有函数的参数都是按值传递的,意味着把函数尾部的值复制到函数内部的参数就和把值从一个变量复制到另一变量是一样。
在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量。
在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
四、JS常见的dom操作api
(1)节点查找API1
2
3
4
5
6
7
8
9
10
11
12
13document.getElementById :根据ID查找元素,大小写敏感,如果有多个结果,只返回第一个;
document.getElementsByClassName :根据类名查找元素,多个类名用空格分隔,返回一个 HTMLCollection 。注意兼容性为IE9+(含)。另外,不仅仅是document,其它元素也支持 getElementsByClassName 方法;
document.getElementsByTagName :根据标签查找元素, * 表示查询所有标签,返回一个 HTMLCollection 。
document.getElementsByName :根据元素的name属性查找,返回一个 NodeList 。
document.querySelector :返回单个Node,IE8+(含),如果匹配到多个结果,只返回第一个。
document.querySelectorAll :返回一个 NodeList ,IE8+(含)。
document.forms :获取当前页面所有form,返回一个 HTMLCollection ;
(2)节点创建API1
2
3
4
5
6
71、 createElement创建元素
var elem = document.createElement("div");
elem.id = 'haorooms';
elem.style = 'color: red';
elem.innerHTML = '我是新创建的haorooms测试节点';
document.body.appendChild(elem);
通过 createElement 创建的元素并不属于 document 对象,它只是创建出来,并未添加到html文档中,要调用 appendChild 或 insertBefore 等方法将其添加到HTML文档中。
1 | 2、createTextNode创建文本节点 |
1 | 3、cloneNode 克隆一个节点 |
1 | 4、createDocumentFragment |
(3)节点修改API1
21、appendChild
parent.appendChild(child);
1 | 2、insertBefore |
1 | 3、insertAdjacentHTML |
1 | 4、Element.insertAdjacentElement() |
1 | 5、removeChild |
1 | 6、replaceChild |
(4)节点关系API1
2
3
4
51、父关系API
parentNode :每个节点都有一个parentNode属性,它表示元素的父节点。Element的父节点可能是Element,Document或DocumentFragment;
parentElement :返回元素的父元素节点,与parentNode的区别在于,其父节点必须是一个Element元素,如果不是,则返回null;
1 | 2、子关系API |
1 | 3、兄弟关系型API |
(5)元素属性型API1
2
3
41、setAttribute 给元素设置属性:
element.setAttribute(name, value);
其中name是特性名,value是特性值。如果元素不包含该特性,则会创建该特性并赋值。
1 | 2、getAttribute |
1 | 3、hasAttribute |
1 | 4、dataset |
(6)样式相关API1
2
3
4
51、直接修改元素的样式
elem.style.color = 'red';
elem.style.setProperty('font-size', '16px');
elem.style.removeProperty('color');
1 | 2、动态添加样式规则 |
1 | 3、classList获取样式class |
1 | 4、window.getComputedStyle |
(7)获取相关高度API1
2
3
4
5getBoundingClientRect
getBoundingClientRect 用来返回元素的大小以及相对于浏览器可视窗口的位置,用法如下:
var clientRect = element.getBoundingClientRect();
clientRect是一个 DOMRect 对象,包含width、height、left、top、right、bottom,它是相对于窗口顶部而不是文档顶部,滚动页面时它们的值是会发生变化的。
参考文章:
2018浅谈前端面试那些事
undefined与null的区别-阮一峰的网络日志
谈谈JavaScript中的基本类型和引用类型|邹斌
总结js常用的dom操作(js的dom操作API)