2017年做网站多少钱,建立什么网站赚钱,网页制作软件只能使用vscode,ip下的网站吗1. 延迟加载JS有哪些方式#xff1f; defer: 等html全部解析完成#xff0c;才会执行js代码#xff0c;顺次执行js脚本 async#xff1a;是和html解析同步的#xff0c;不是顺次执行js脚本#xff08;当有很多个js时#xff09;#xff0c;是谁先加载完谁先执行。 …1. 延迟加载JS有哪些方式 defer: 等html全部解析完成才会执行js代码顺次执行js脚本 async是和html解析同步的不是顺次执行js脚本当有很多个js时是谁先加载完谁先执行。 script defer typetext/javascript srcscript.js/script html
headtitle/title// script typetext/javascript srcscript.js/script 放这里的话浏览器会先解析并执行js才会加载dom
/head
bodydiv idbox1111111/divscript typetext/javascript srcscript.js/script //一般放在这里这样的话就会先解析dom其次才解析并执行js这样做的好处就是即使js出现了错误也不会影响dom的渲染。
/body
/html/* 延迟加载JS */
html
headtitle/title// 这样写加个defer或者async就可以做到使JS延迟加载script defer typetext/javascript srcscript.js/script
/head
bodydiv idbox1111111/div
/body
/html
// script.js文件
console.log( document.getElementById(box) )2. JS的数据类型有哪些 基本类型string,number,boolean,undefined,null,symbol 引用数据类型object 3. JS数据类型考题
scriptalert( true 1); // 2alert( name true); // nametruealert( undefined 1); // NANalert( typeof null); // obj
/scriptscriptalert( typeof(NAN) ); // number NAN是一个数值类型但不是一个具体的数字alert( typeof(undefined) ); // undefinedalert( typeof(null) ); // obj
/script
4. null和undefined的区别 1. 作者在设计js的时候先设计的null设计js的时候借鉴了java 2. null会被隐式转换为0出现错误的时候不容易被发现——因此才设计出了undefined scriptalert ( Number(null) ); // 0alert( Number(undefined) ); // NAN
/script 具体的区别 null是一个表示“无”的对象空指针对象转为数值时为0 undefined是一个表示“无”的原始值转为数值时为NAN; 5. 和的区别 比较的是值会通过valueOf进行一个隐式转换 除了比较值还比较类型 /* 会通过valueOf进行一个隐式转换 */
scriptalert( 1 1 ); // ture 会发生隐式转换string--numberalert( true 1 ); // true 会发生隐式转换boolean--numberalert( null undefined ); // truealert( [1,2] 1,2 ); // true 会发生隐式转换object--基本数据类型var s 2;if( s 2 ){alert ( typeof s ); //string 注意这里还是string而不是number}
/script/* valueOf()方法通常由JavaScript在后台自动调用并不显式的出现在代码中*/
6. JS的微任务和宏任务 JS语言的一大特点就是单线程也就是说同一时间只能做一件事。 单线程就意味着所有任务需要排队前一个任务结束才会执行后一个任务如果前一个任务耗时很长后一个任务就不得不一直等着。 代码执行任务的优先级同步代码异步代码微任务宏任务 7. JS作用域 1. 除了函数外JS没有块级作用域 /* 因为函数有作用域所以拿不到a */
script
function fun(){var a 10;
}
fun();
console.log(a); // 会报错a is not defined
/script/* 因为没有作用域所以可以打印出i */
script
for( var i0; i10; i){
}
console.log( i ); //i打印出结果为10
/script 2. 作用域是指这个变量或者说这个代码起作用的范围 作用域链内部可以访问外部的变量但外部不可以访问内部的 /* 内部是可以访问外部的 */
script
function fun(){var a 10;function foo(){console.log( a ); // a为10}foo();
}
foo();
/script
/* 内部有先拿内部的没有再去外部找 */
script
var a 10;
function fun(){var a 20;function foo(){var a 30;console.log( a ); // a为30}foo();
}
foo(); 注意声明变量是用var还是没有写window.) script
(function(){var a b 10; b前面没有var
})()
console.log( b ); //此时b的值为10
/script/* b的写法相当于全局有个b */
script
var b 10
(function(){var a b 10;
})()
console.log( b ); //此时b的值为10
/scriptJS有变量提升的机制变量悬挂声明 /* 这样打印会报错 */
script
function fun(){console.log(str)
}
/script/* 这样写会打印出undefined */
script
function fun(){console.log(str)var str 11111
}
/script/* 上面那样写是因为变量提升其实就相当于这样写 */
script
function fun(){var strconsole.log(str) // 所以才会打印出undefinedstr 11111
}
/scriptscript
var name a;
(function(){if(typeOf name undefined){var name b;console.log(111 name); // 最终会打印出111b因为name会变量提升}else{console.log(222 name);}
})()
/script 声明变量的优先级 声明普通函数 参数 变量提升 script
function fun(){var a 10;function a(){}console.log( a ); // 打印10
}
fun()
/scriptscript
function fun(){var a 10;var a function (){}console.log( a ); // 打印出函数
}
fun()
/scriptscript
function fun(){console.log( a ); // 打印出函数var a 10;function a(){}
}
fun();
/scriptscript
function fun(a){console.log( a ); // 打印出100var a 10;
}
fun(100);
/scriptscript
function fun(a){console.log( a ); // 打印出函数function a (){};
}
fun(100);
/scriptscript
function fun(a){var a 10;function a (){};console.log( a ); // 打印出10
}
fun(100);
/script8. JS对象 对象是通过new操作符构建出来的所以对象之间不相等除了引用外 script
console.log( [1,2,3] [1,2,3] ) // false
/script 对象要注意引用的时候 script
var obj1 {a : 1
};
var obj2 obj1;
console.log(obj1,obj2); // 打印出的值是一样的obj2.a aaaaaa;
console.log(obj1,obj2) // 打印出的值依然是一样的var arr1 [1,2,3];
var arr2 arr1;
console.log( arr1 arr2 ); // 打印出true
/script 对象的key永远都是字符串 script
var obj1 {a: 1,张三: 你好
}
for (var k in obj1){console.log(k); // a 张三console.log( typeof k ); // string string
}
/scriptscript
var o {b: bbbb
}
var obj1 {a: 1,张三: 你好
}
obj1[o] 123
for (var k in obj1){console.log(k); // a 张三 [object object]console.log( typeof k ); // string string string因为此时的obj1已经变成obj1{a:1, 张三: 你好, {}:123}
}
/scriptscript
var a {}
var b {key: a,
}
var c {key: c,
}
a[b] 123; // 此时a就会变成 var a { [Object Object]: 123}
a[c] 456; // c其实也是[Object Object]那么它的456就会覆盖前面的123
console.log( a[b] ); //打印的结果是456
/* 其实就相当于 */
let m {}
m.a 1;
m.a 2;
console.log( m.a ); // 打印出的结果肯定是2
/script 对象如何找属性和方法每一个对象都是通过构造函数构建出来的 先在对象本身找 构造函数中找 对象原型中找 原型对象中找 对象上一层原型中找 每一个函数都自带一个prototype属性也就是我们说的原型 原型和原型链-CSDN博客 /* 综合题目1 */
function Foo(){getName function(){console.log(1)} //注意此处的getName是全局的是window.getNamereturn this; // 也就是window
}
Foo.getName function(){console.log(2)}
Foo.prototype.getName function(){console.log(3)}
var getName function(){console.log(4)}
function getName(){console.log(5)
}
Foo.getName(); // 2
getName; // 4
Foo().getName(); // 1 ——相当于是window.getName()
getName(); // 1
new Foo().getName(); // 3/* 综合题目2 */
var o {a: 10,b: {fn: function(){console.log( this.a ); // b里面没有a所以打印的结果是undefinedconsole.log( this ); // 打印出b这个对象{fn: f}}}
}
o.b.fn();/* 综合题目3 */
window.name xiongxinyu;
function A(){this.name 123;
}
A.prototype.getA function(){console.log(this)return this.name 1;
}
let a new A();
let funcA a.getA;
funcA(); // 结果是打印了window返回了xiongxinyu1/* 综合题目4 */
var length 10;
function fn(){return this.length 1;
};
var obj {length: 5,test1: function(){return fn();}
}
obj.test2 fn;
/* 执行完上一行代码相当于obj变成了
var obj {length: 5,test1: function(){return fn();}test2: function fn(){return this.length 1;};
} */
console.log( obj.test1() ); // 这是一个闭包的过程this指向的是window所以最后结果是11
console.log( fn() obj.test2() ); // false // fn()返回的是11obj.test2中的this代表的是obj所以返回的是6
console.log( obj.test1() obj.test2() ); // false 11并不等于6