学习笔记2

二十六、交换字符串中的两个单词

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
// Smith, John
console.log(newstr);
//自己只想到一个蠢方法
var str = "John Smith";
        var arr = [];
        arr = str.split(' ');
        for(var i = 0; i<arr.length; i++) {
            a = arr[1];
            b = arr[0];
        }
var str2 = a +' '+ b;
console.log(str2);

二十七、如何将浮点数点左边的数每三位添加一个逗号,如12000000.11转化为『12,000,000.11』?

    function commafy(num){
        return num && num
            .toString()
            .replace(/(\d)(?=(\d{3})+\.)/g, function($1, $2){
                return $2 + ',';
            });
   } 

二十八、null,undefined的区别
null 表示一个对象是“没有值”的值,也就是值为“空”;
undefined 表示一个变量声明了没有初始化(赋值);

undefined不是一个有效的JSON,而null是;
undefined的类型(typeof)是undefined;
null的类型(typeof)是object;

Javascript将未赋值的变量默认值设为undefined;
Javascript从来不会将变量设为null。它是用来让程序员表明某个用var声明的变量时没有值的。

注意:
在验证null时,一定要使用 === ,因为 == 无法分别 null 和 undefined
null == undefined // true
null === undefined // false

二十九、写一个通用的事件侦听器函数。

// 自己只能到这样。。。
function bindEvent(elem, type, selector, fn){
    if(fn === null){
        fn = selector;
        selector = null;
    }
}

elem.addEventListener(type, function (e) {
    var target;
    if(selector) {
        target = e.target;
        if(target.matches(selector)){
            fn.call(target, e);
        } else {
            fn(e);
        }
    }
})

答案

// event(事件)工具集,来源:github.com/markyun
    markyun.Event = {
        // 页面加载完成后
        readyEvent : function(fn) {
            if (fn==null) {
                fn=document;
            }
            var oldonload = window.onload;
            if (typeof window.onload != 'function') {
                window.onload = fn;
            } else {
                window.onload = function() {
                    oldonload();
                    fn();
                };
            }
        },
        // 视能力分别使用dom0||dom2||IE方式 来绑定事件
        // 参数: 操作的元素,事件名称 ,事件处理程序
        addEvent : function(element, type, handler) {
            if (element.addEventListener) {
                //事件类型、需要执行的函数、是否捕捉
                element.addEventListener(type, handler, false);
            } else if (element.attachEvent) {
                element.attachEvent('on' + type, function() {
                    handler.call(element);
                });
            } else {
                element['on' + type] = handler;
            }
        },
        // 移除事件
        removeEvent : function(element, type, handler) {
            if (element.removeEventListener) {
                element.removeEventListener(type, handler, false);
            } else if (element.datachEvent) {
                element.detachEvent('on' + type, handler);
            } else {
                element['on' + type] = null;
            }
        },
        // 阻止事件 (主要是事件冒泡,因为IE不支持事件捕获)
        stopPropagation : function(ev) {
            if (ev.stopPropagation) {
                ev.stopPropagation();
            } else {
                ev.cancelBubble = true;
            }
        },
        // 取消事件的默认行为
        preventDefault : function(event) {
            if (event.preventDefault) {
                event.preventDefault();
            } else {
                event.returnValue = false;
            }
        },
        // 获取事件目标
        getTarget : function(event) {
            return event.target || event.srcElement;
        },
        // 获取event对象的引用,取到事件的所有信息,确保随时能使用event;
        getEvent : function(e) {
            var ev = e || window.event;
            if (!ev) {
                var c = this.getEvent.caller;
                while (c) {
                    ev = c.arguments[0];
                    if (ev && Event == ev.constructor) {
                        break;
                    }
                    c = c.caller;
                }
            }
            return ev;
        }
    };

三十、javaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具有指定名称的属性。
此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
方法: object.hasOwnProperty(proName);

三十一、ajax解决浏览器缓存问题?
1、ajax发送请求前加上 anyAjaxObj.setRequestHeader(‘If-Modified-Since’,”0”);
2、在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“Cache-Control”, “no-cache”)。
3、在URL后面加上一个随机数:”fresh=” +Math.random();
4、在URL后面加上时间戳:”nowtime=” + new Date().getTime();
5、如果使用jQuery。直接这样就可以了。

$.ajaxSetup({cache:false})。
//这样页面的所有ajax都会执行这条语句就是不需要保存缓存记录。

三十三、document.write 和 innerHTML 的区别
document.write 还能重绘整个页面;
innerHTML可以重绘页面的一部分。

三十四、DOM 操作怎么添加、删除、移动、复制、创建和查找节点?
1) 创建
a: createDocumentFragment() // 创建一个DOM片段
b: createElement() //创建一个具体元素
c: createTextNode() // 创建一个文本节点

2)添加、移除、替换、插入
appendChild();
removeChild();
replaceChild();
insertBefore(); //在已有的子节点前插入一个新的子节点

3)查找
getElementById();
getElementsByTagName(); //通过元素的Name属性的值(IE容错能力较强,会得到一个数组,其中包括id等于name值的)
getElementsByName();

三十五、使用JS实现获取文件扩展名

var fileName = "http://www.111cn.net/sys/nginx/62888.htm";

// 方法一:
var fileExtension = fileName.substring(fileName.lastIndexOf('.') + 1);

//方法二:
var fileExtension = fileName.split('.').pop().toLowerCase();

//方法三:
var str = document.getElementById('FileUpload1').value;
var pos = str.lastIndexOf(".");
var lastname = str.substring(pos, str.length);

三十六、在实现一些需要被频繁调用的函数时,我们通常会使用debounce或 throttle 方法
debounce和throttle

三十七、数组乱写,又称洗牌

function shuffle(a) {
    var b = [];
    while(a.length){
        var index = Math.floor(Math.random()*a.length);
        b.push(a[index]);
        a.splice(index, 1);
    }
    return b;
}

var a = [1,2,3,4,5];
console.log(shuffle(a));  //4,2,5,1,3

三十八、使用Promise描述如下过程: 绿灯亮3秒,然后黄灯再亮3秒。灯亮过程可以用console表示。

 function sleep(delay){
        var now = new Date().getTime();
        while(new Date().getTime() - now < delay){
        }
    }

    function led(color){
        console.log(color);
        sleep(3000);
// //Promise 对象用于异步计算. 一个Promise对象代表一个值, 该值可以在当前或未来可用, 或永远不可用.
        return new Promise(function(resolve,reject){
            resolve();
        });
    }

    led("green").then(function(){
        led("red");
    }).then(function(){
        led("yellow");
    });

三十九、数组去重
数组去重

//最熟悉的方法就是json
var arr = [1,1,1,2,2,2,3,3,3];
var arr2 = [];
var json = {};
for(var i = 0; i<arr,length; i++) {
    json[arr[i]] = 'a';
}
for(var name in json) {
    arr2.push(name);    
}
console.log(arr2);

//使用数组查找方法
var arr = [1,1,1,2,2,2,3,3,3];
var arr2 = [];
for(var i = 0; i<arr.length; i++) {
    if(arr2.indexOf(arr[i])<0) {
        arr2.push(arr[i]);
    }
}
document.write(arr2);

//使用数组方法2
var arr = [1,2,1,1,2,3,4,5,5,6];
arr.sort();

for(var i = 0; i<arr.length; i++) {
    if(arr[i] === arr[i+1]){
        arr.splice(i, 1);
        i--;
    }
}
alert(arr);

四十、IE与W3C事件模型有什么区别:
通常,事件传送有三个阶段: 事件捕获,停留目标阶段,事件冒泡阶段
1、阶段差异: DOM事件模型包含捕获阶段和冒泡阶段,DOM事件模型可以使用event.stopPropagation()来阻止事件流;IE事件模型只包含冒泡阶段;
2、事件差异
DOM事件模型:addEventListener
IE事件模型:attachEvent;
3、参数差异
在DOM事件模型中,addEventListener(eventType, handler, useCapture)有三个参数,eventType没有on字符串,handler参数是一个事件句柄,这个函数或方法带有一个事件对象参数,useCapture参数决定了事件句柄触发在哪种事件传播阶段,如果useCapture为true则为捕获阶段,反之则为冒泡阶段。
在IE事件模型中,attachEvent(eventType, handler)有两个参数,eventType 带 on字符串,handler参数是一个事件句柄,这个函数或方法带有一个事件对象参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值