1.封装typeof
function myTypeof(val){var type = typeof(val);var toStr = Object.prototype.toString;var res = {'[object Array]': 'array','[object Object]': 'object','[object Number]': 'object number','[object String]': 'object string','[object Boolean]': 'object boolean'}if(val === null){return null; //先判断是否是null类型因为 null 是特殊的object型 如果是的话就先排除}else if(type === 'object'){ //判断是否是引用类型的数据var ret = toStr.call(val); //判断具体的引用类型return res[ret]; //返回对象中具体的引用类型}else{return type; //若不是引用类型的数据 则直接返回type类型数据}}console.log(myTypeof(new Number(1)));
2.数组去重
数组去重的12种方法
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];Array.prototype.unique = function(){var temp = {},newArr = [];for(var i = 0;i<this.length;i++){if(!temp.hasOwnProperty(this[i])){temp[this[i]] = this[i];newArr.push(this[i]);}}return newArr;}console.log(arr.unique())
解题思路: 利用键名唯一的特性__hasOwnProperty
设置一个空对象,遍历数组 判断传入的每个数组元素是否为其属性 如果不是则空对象传入此属性
新数组加入此元素.
字符串去重
var str = '1122333aaaabbbbb';String.prototype.unique = function(){var temp = {},newArr = '';for(var i=0;i<this.length;i++){if(!temp.hasOwnProperty(this[i])){temp[this[i]] = this[i];newArr+=this[i];}}return newArr;}console.log(str.unique());
解题思路: 利用键名唯一的特性__hasOwnProperty
设置一个空对象,遍历字符串 判断每个字符,是否为对象的属性值,若不是则放进新字符串
打印字符串中只出现过一次的字符组成新的字符串
var str = 'truaiwritwtruibowertpwrisweqx';function test(str) {var temp = {},newStr = '';for (var i = 0; i < str.length; i++) {if (temp.hasOwnProperty(str[i])) {temp[str[i]]++;} else {temp[str[i]] = 1;}}for (var key in temp) {if (temp[key] === 1) {newStr += key;}}return newStr;}console.log(test(str));
解题思路: 利用键名唯一的特性__hasOwnProperty
1.设置一个空对象,遍历字符串 判断每个字符,是否为对象的属性值,若是则将属性的键值++,若不是将属性的键值设置为1
2.遍历所有键值为1的属性 将其放入新数组
打印字符串中第一次出现且只出现过一次的字符
var str = 'truaiwritwtruibowertpwrisweqx';function test(str) {var temp = {},newStr = '';for (var i = 0; i < str.length; i++) {if (temp.hasOwnProperty(str[i])) {temp[str[i]]++;} else {temp[str[i]] = 1;}}for (var key in temp) { //遍历对象if (temp[key] === 1) {return key;}}}console.log(test(str));
解题思路: 利用键名唯一的特性__hasOwnProperty
1.设置一个空对象,遍历字符串 判断每个字符,是否为对象的属性值,若是则将属性的键值++,若不是将属性的键值设置为1
2.遍历所有键值为1的属性 遍历到的第一个输出出来
习题
1
function Test(a,b,c){var d = 0;this.a = a;this.b = b;this.c = c;function e(){d++;console.log(d);}this.f = e;}// var this = {// f:function(){// }// }// AO:{// d: 0// }// this.f = function(){// d++;// console.log(d);// }// return this;var test1 =new Test();test1.f(); //1test1.f(); //2var test2 = new Test();test2.f(); //1
2
function test(){console.log(typeof(arguments)); //object 因为argumemts是类数组}test();
3
var test = function a(){ // 函数表达式在外部直接忽略 此处a被忽略// a(); //内部可以访问return 'a';}console.log(test.name);// a()//外部无法访问 因为被忽略console.log(typeof(a)); //undefined string 类型
4 优化改写下列函数
function test(day){switch (day) {case 1:console.log('Mon');break;case 2:console.log('Tue');break;case 3:console.log('Wed');break;case 4:console.log('Thu');break;case 5:console.log('Fri');break;case 6:console.log('Sat');break;case 7:console.log('Sun');break;default:console.log('I dot know');}}test(3);//写法一function test(day){var weekday = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'];// weekday.splice(0,0,'');console.log(weekday);weekday[day-1] !== undefined ? console.log(weekday[day-1]) : console.log('I don\'t know');}test(1);//写法二 不改变数组的情况下取值下标不改 正确的获取值function test(day){var weekday = [,'Mon','Tue','Wed','Thu','Fri','Sat','Sun'];// weekday.splice(0,0,'');console.log(weekday);weekday[day] !== undefined ? console.log(weekday[day]) : console.log('I don\'t know');}test(1);//写法三function test(val) {var res = {'1': 'Mon','2': 'Tue','3': 'Wed','4': 'Thu','5': 'Fri','6': 'Sat','7': 'Sun'}// console.log(res[val]);return res[val] === undefined ? 'i dont konw' : res[val];}console.log(test(3));
