JS日常习题

对于以下HTML按字符重新排序DOM节点:

<ol id="test-list">
    <li class="lang">Scheme</li>
    <li class="lang">JavaScript</li>
    <li class="lang">Python</li>
    <li class="lang">Ruby</li>
    <li class="lang">Haskell</li>
</ol>

解法一:清空ol内内容后使用排序好的数组进行append添加【要点1:使用Array.from()转化为数组。要点2:使用innerText获取标签内容(其实不用也可以)】PS.为啥这里不清空也可以。。

var list = document.getElementById("test-list");
var arr = Array.from(list.children);
arr.sort(function(x, y) {
   return x.innerText > y.innerText;
});
for(let i = 0; i < arr.length; i++) {
    list.appendChild(arr[i]);
}
解法二:使用冒泡法直接操作ol内内容【原理:要插入的节点若已存在于当前的文档树,则此节点首先会从原先的位置删除,再插入到新的位置】

var parent = document.querySelector('#test-list');
var lis = parent.children;//注意,这里不是.child,因为要获取所有孩子

for(i = 0; i < lis.length - 1 ; i++) {
    for (j = i + 1; j< lis.length; j++) {
        if(lis[i].innerText > lis[j].innerText)
        {
           parent.insertBefore(lis[j], lis[i]);
        }
    }
}

参考:廖雪峰-插入DOM

                                                                           手动分割线                                                                           

jQuery处理表单选中逻辑实现

<form id="test-form" action="test">
    <legend>请选择想要学习的编程语言:</legend>
    <fieldset>
        <p><label class="selectAll"><input type="checkbox"> <span class="selectAll">全选</span><span class="deselectAll">全不选</span></label> <a href="#0" class="invertSelect">反选</a></p>
        <p><label><input type="checkbox" name="lang" value="javascript"> JavaScript</label></p>
        <p><label><input type="checkbox" name="lang" value="python"> Python</label></p>
        <p><label><input type="checkbox" name="lang" value="ruby"> Ruby</label></p>
        <p><label><input type="checkbox" name="lang" value="haskell"> Haskell</label></p>
        <p><label><input type="checkbox" name="lang" value="scheme"> Scheme</label></p>
        <p><button type="submit">Submit</button></p>
    </fieldset>
</form>
实现以下逻辑:当用户勾上“全选”时,自动选中所有语言,并把“全选”变成“全不选”;当用户去掉“全不选”时,自动不选中所有语言;当用户点击“反选”时,自动把所有语言状态反转(选中的变为未选,未选的变为选中);当用户把所有语言都手动勾上时,“全选”被自动勾上,并变为“全不选”; 当用户手动去掉选中至少一种语言时,“全不选”自动被去掉选中,并变为“全选”。

'use strict';

var
    form = $('#test-form'),
    langs = form.find('[name=lang]'),
    selectAll = form.find('label.selectAll :checkbox'),
    selectAllLabel = form.find('label.selectAll span.selectAll'),
    deselectAllLabel = form.find('label.selectAll span.deselectAll'),
    invertSelect = form.find('a.invertSelect');

// 重置初始化状态:
form.find('*').show().off();
form.find(':checkbox').prop('checked', false).off();
deselectAllLabel.hide();
// 拦截form提交事件:
form.off().submit(function (e) {
    e.preventDefault();
    alert(form.serialize());
});
逻辑代码:

selectAll.click(function(){
  if(selectAll.is(':checked')){
    selectAllLabel.hide();
    deselectAllLabel.show();//因为是重复操作,所以两个都不能忘
    langs.prop('checked',true);
  }else{
  selectAllLabel.show();
  deselectAllLabel.hide();
  langs.prop('checked',false);
  }
});
invertSelect.click(function(){
  langs.map(function(){
    $(this).prop('checked',!$(this).is(':checked'));//this包装成jquery对象才能使用prop
  });
});
langs.click(function(){ //如果仅仅只是ifelse而没有langs.click的话无法起监视事件作用
  if(langs.filter(':checked').length===langs.length){
    selectAll.prop('checked',true);
    selectAllLabel.hide();
    deselectAllLabel.show();
  }else{
    selectAll.prop('checked',false);
    selectAllLabel.show();
    deselectAllLabel.hide();
}});
参考: 廖雪峰-jQuery事件

----------------------------------------------------------------------------------------------------------------------------------

有关let和var

代码如:

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };}
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}

问两者执行完后控制台输出a[3]()的结果分别是什么?

答:前者为10,后者为3.

解释:可将var视为唯一的一个变量只占有唯一一处内存空间,因此不论多少次循环,在最后输出a[x]()时都会只显示最终结果的那个i;而let在每次循环都会新占用一个内存空间进行存放每次刷新的数值,所以输出结果时从不同的内存空间进行取值,结果自然不一样。

再如:

for (var i=0;i<10;i++) {
  a[i]=(function(i){
    return function() {
      console.log(i);
    })(i);
}

此处尽管用的是唯一一处内存空间占有的var定义变量,但是在循环体内是一个立即执行函数,当i传到这个函数里时就变成了这个函数的局部变量,会跟着新的函数变量占用不同的内存空间,即此处函数内部的局部变量有不同的内存空间存放其值。故此处若输出a[3]()结果则是3.【写到这里突然发现了解JS运行时对内存的使用情况对理解作用域闭包啥的很管用。。】

参考:SF


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值