浏览器的渲染过程:
解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js
CSS 文件下载完成,开始构建 CSSOM(CSS 树)
CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)
布局(Layout):计算出每个节点在屏幕中的位置
显示(Painting):通过显卡把页面画到屏幕上
DOM 树 和 渲染树 的区别:
DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this 。
var obj ={};
obj.__proto__ = Base.prototype;
Base.call(obj);
function getStyle(elem, name){if(window.getComputedStyle){
return window.getComputedStyle(elem)[name];}else{
return elem.currentStyle[name];}}
用js创建10个 a 标签,点击的时候弹出来对应的序号
var i;for(i=0;i<10;i++){(function(i){
var a = document.createElement('a');
a.innerHTML = i + '<br>';
a.addEventListener('click',function(e){
e.preventDefault();alert(i);
});
document.body.appendChild(a);})(i);}
字符串反转,如将 ‘12345678’ 变成 ‘87654321’
var str = '12345678';
str = str.split('').reverse().join('');
判断一个字符串中出现次数最多的字符,统计这个次数
var json ={};
for (var i = 0; i < str.length; i++){if(!json[str.charAt(i)]){
json[str.charAt(i)] = 1;// json[str[i]] = 1;}else{
json[str.charAt(i)]++;}};
var iMax = 0;
var iIndex = '';
for(var i in json){if(json[i]>iMax){
iMax = json[i];
iIndex = i;}}
写一个能遍历对象和数组的通用的forEach函数
function forEach(obj,fn){
var key;
if(obj instanceof Array){obj.forEach(function(item,index){fn(index,item);});}else{for(key in obj){fn(key,obj[key]);}}}
var arr = [1,2,3];//数组
forEach(arr,function(index,item){
console.log(index,item);})
var obj ={x:1,y:2};//对象
forEach(obj,function(key,val){
console.log(key,val);})
编写一个数组去重的方法
function unique(arr){
var result=[];
for (var i = 0, len = arr.length; i < len; i++){
var arri = arr[i];
if(result.indexOf(arri)<0){
result.push(arri);}}
return result;}
JavaScript字符串去重的四种方法
//方法一:for遍历
function quchong1(str){
var newStr="";
var flag;for(var i=0;i<str.length;i++){
flag=1;for(var j=0;j<newStr.length;j++){if(str[i]==newStr[j]){
flag=0;
break;}}if(flag) newStr+=str[i];}
return newStr;}//方法二:indexOf(无兼容问题)
function quchong2(str){
var newStr="";for(var i=0;i<str.length;i++){if(newStr.indexOf(str[i])==-1){
newStr+=str[i];}}
return newStr;}//方法三:search()方法
function quchong3(str){
var newStr="";for(var i=0;i<str.length;i++){if(newStr.search(str[i])==-1)
newStr+=str[i];}
return newStr;}//方法四:对象属性
function quchong4(str){var obj={};
var newStr="";for(var i=0;i<str.length;i++){if(!obj[str[i]]){
newStr+=str[i];
obj[str[i]]=1;}}
return newStr;}
function serlize(url){var result={};
//1、寻找?后面的字符串
url=url.substr(url.indexOf("?")+1);
//2、将字符串用&分隔
var args=url.split("&");//[“a=1”,”b=2”]
for (var i = 0, len = args.length; i < len; i++){
var arg = args[i];
var item = arg.split('=');
//3、对象的键=值
result[item[0]]= item[1];}
return result;}
function parseSearch(){
var search = location.search;
var obj ={};
if(search !=""){
var splits =
search.slice(1).split("&");//["username=laila","password=123456"]
console.log(splits);for(var i = 0 ;i<splits.length;i++){
var arr = splits[i].split("=");
obj[arr[0]] = arr[1];}}
console.log(obj)}parseSearch();
深度克隆
function clone(obj){let result = obj instanceof Array ? [] :{}for (let key in obj){if (obj[key] instanceof Array){
result[key] = clone(obj[key]);}else if (obj[key] instanceof Object){
result[key] = clone(obj[key]);}else{
result[key] = obj[key];}}
return result;}