// 答案: A,B,注意动态改变,内容
for (var i = 1; i <= 3; i++){
setTimeout(function(){
console.log(i);
},0)
}
// 答案: 4 4 4 ,因为setTimeout是异步函数
推荐参考链接1 推荐参考链接2
var a = 1;
function foo() {
if(!a){
var a = 2
}
alert(a);
}
foo()
答案是:B,
涉及到的知识点有作用域,变量提升。
因为var是函数级作用域,foo函数中出现var a=2 的存在,
就默认在函数内顶端 声明var a;此时这个a没有被赋值所以是undefined;
然后执行
if(!a)
等价于!undefined
肯定是true。然后给a赋值为2.所以打印的是2。
<div class="wrapper">
<div class="content">div>
div>
答案:
/*第一种通过定位和位移(未知子模块宽高)或者margin(已知子元素宽高)*/
html,
body,
.wrapper{
width:100%;
height:100%;
}
.content{
width:30%;
height:30%;
position:absolute;
top:50%;
left:50%;
transform:tranlate(-50%,-50%);
}
/*或者*/
.content{
width:200px;
height:200px;
position:absolute;
top:50%;
left:50%;
margin-top:-100px;
margin-left:-100px;
}
/*第二种通过flex布局*/
.wrapper{
width:100%;
height:500px;
display:flex;
flex-flow: row nowrap;
/*align-items 定义子元素交叉轴也就是垂直方向的对齐方式*/
align-items:center;
/*justify-content 定义子元素水平方向的对齐方式*/
justify-content:center;
}
.content{
width:100px;
height:100px;
background: red;
}
<ul id="test">
<li>这是第一条li>
<li>这是第二条li>
<li>这是第三条li>
<li>这是第四条li>
ul>
const test = document.querySelector('#test');
const lis = test.querySelectorAll('li')
/*第一种用 let 声明*/
for(let i = 0; i<lis.length; i++){
lis[i].addEventListener('click',function(e){
console.log(i);
},false)
// ------两种写法而已-----
// lis[i].οnclick=function() {
// console.log(i);
// }
}
/*第二种,用 var 声明,采用自执行函数*/
for (var i = 0; i < lis.length; i++) {
lis[i].addEventListener(
'click',
(function(num) {
return function() {
console.log(num);
};
})(i),
false
);
}
举个例子,比如一个宿舍的同学同时快递到了,一种方法就是他们都傻傻地一个个去领取,还有一种方法就是把这件事情委托给宿舍长,让一个人出去拿好所有快递,然后再根据收件人一一分发给每个宿舍同学;
在这里,取快递就是一个事件,每个同学指的是需要响应事件的 DOM 元素,而出去统一领取快递的宿舍长就是代理的元素,所以真正绑定事件的是这个元素,按照收件人分发快递的过程就是在事件执行中,需要判断当前响应的事件应该匹配到被代理元素中的哪一个或者哪几个。
const test = document.querySelector('#test');
test.addEventListener(
'click',
function(e) {
// 处理兼容性的问题
const event = e || window.event;
const target = event.target || event.srcElement;
console.log(target.innerText);
},
false
);
参考事件捕获,事件冒泡,事件代理详细内容
(function(window) {
function fn(str) {
this.str = str;
}
fn.prototype.format = function() {
// var arg = '________';
var arg = arguments;
// return this.str.replace(_______, function(a, b, c, d) {
return this.str.replace(/\{(\d+)\}/g, function(match, b, offset, string) {
console.log(match); // 根据正则匹配到{}的字符串
console.log(b); // {}中的数字字符串
// 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。
// 例如,用 /\{(\d+)\}/g 这个来匹配,b 就是匹配的 \d+。
console.log(offset); // 该字字段在字符串中的开始索引位置
console.log(string); // 原始字符串
console.log(arg[b]);
return arg[b] || '';
});
};
window.fn = fn;
})(window);
//use
(function() {
var t = new fn('{1}{2}
');
console.log(t.format('http://www.alibaba.com', 'Alibaba', 'Welcome'));
})();
replace()函数中的b为什么会输出{}里面的内容。请参考这个链接描述那段里的第二段
// 函数方法
function strTrim(str) {
return str.replace(/(^\s+)|(\s+$)/g,'')
}
// 重写trim方法
if(!String.prototype.trim){
String.prototype.trim=function(){
//利用正则匹配去除字符串前后空格
return this.replace(/(^\s+)|(\s+$)/g,"");
}
}
const str = ' Hello,Arthas! http://www.xueyunhao.com '
console.log(str);
console.log(strTrim(str));
console.log(str.trim());
let newArray = []; // 创建一个空数组,用来存放获取的数字
// 封装一个获取10-100随机数的函数
function getRandomNumber(startNum, endNum) {
const rangeChoice = endNum - startNum + 1; // +1 是为了能够取到100;
const result = Math.floor(Math.random() * rangeChoice + startNum);
return result;
}
// 循环10次获取数字并填入数组
for (let i = 0; i < 10; i++) {
newArray.push(getRandomNumber(10, 100));
}
console.log(newArray);
// 将数组进行排序
newArray.sort(function(a, b) {
return a - b;
});
console.log(newArray);
// 第一种方法,使用JSON.parse()和JSON.stringify()对对象进行深拷贝
const arthas = {
fn: function() {
console.log('hello Arthas');
},
b: { c: 1 },
c: [1, 2, 3],
name: 'Arthas',
nowDate: new Date(),
f: null,
g: undefined,
n:123,
};
function deepClone(obj){
return JSON.parse(JSON.stringify(obj))
}
const xue = deepClone(arthas);
console.log(arthas);
console.log(xue);
// 上述clone的方法会忽略function和undefined的字段,对date类型支持貌似也不友好。而且只能克隆原始对象自身的值,不能克隆它继承的值
// 对于纯数据的json对象的深克隆,可以使用JSON.parse()和JSON.stringify()方法,
// 第二种方法,
const arthas = {
fn: function() {
console.log('hello Arthas');
},
b: { c: 1 },
c: [1, 2, 3],
name: 'Arthas',
nowDate: new Date(),
f: null,
g: undefined,
n:123,
};
function deepClone(obj) {
if (obj === null) {
return null
}
const result = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object') {
result[key] = deepClone(obj[key]); // 如果是对象,再次调用该方法自身
} else {
result[key] = obj[key];
}
}
}
return result;
}
const xue = deepClone(arthas);
console.log(arthas);
console.log(xue);