Open Quickeryi opened 7 years ago
提供俩个数组扁平化操作方法
let arr = [1, [2], [3, [4, [5]]]];
let flatten = (arr) => {
return arr.reduce(
(prev, next) => {
return prev.concat(Array.isArray(next) ? flatten(next) : next);
},
[]
);
}
flatten(arr); // [1, 2, 3, 4, 5]
let arr = [1, [2], [3, [4, [5]]]];
let flatten = (arr) => {
let _arr_ = [];
if (Array.isArray(arr)) {
for (let i = 0, len = arr.length; i < len; i++) {
_arr_ = _arr_.concat(flatten(arr[i]));
}
} else {
_arr_.push(arr);
}
return _arr_;
}
flatten(arr); // [1, 2, 3, 4, 5]
# new Function("arg_name_1", "arg_name2", ..., "main_body")
1)不推荐上述方法:语义不明确;代码解析两次(第二次发生在解析传入的参数,类似于解析eval(''))
# 函数是一个对象(new Function()),所以函数名只是一个指针(此处有助于理解为啥木有重载功能)
# arguments.callee => 函数本身 , arguments.callee.caller => 调用该函数者
# 函数的属性和方法:
- length:能够接收的命名参数个数
- prototype
# apply(context, [args_array | arguments])
# bind() :返回指定作用域的函数实例
var s1 = 'this is a string';
s1.toUpperCase();
// 上述一段代码在后台实际的执行情况如下
var s1 = new String('this is a string');
s1.toUpperCase();
s1 = null;
// 基本包装类型的生命周期在代码执行方法后就销毁了
var b = new Boolean(false); b && true; // true(此时是对b这个对象求值,所以为true)
var b = Boolean(false); b && true; // false
var num = Number(10); num instanceof Number; // false
// 三个方法均不影响原数据
eval
通过eval
执行的代码与执行调用eval
的环境具有相同的作用域
eval()
中创建的任何变量和函数都不会在编译阶段被提升,只有在执行eval
时才被解析
提供一个实现连字符查找值的方法
// 输入: {a: {b: {c: 1}}}, ‘a.b.c’
// 输出:1
/**
* 判断对象是否有 key
*/
let isEmpty = (obj) => {
"use strict";
for (let key in obj) {
return false;
}
return true;
};
/**
* 判断值是否为对象
*/
let isObject = (obj) => {
"use strict";
return toString.call(obj) === "[object Object]";
};
/**
* 查找
*/
let find = (obj, key) => {
"use strict";
if (!isObject(obj) || isEmpty(obj) || !key) return void 0;
let keys = key.split('.'),
next = obj[keys[0]],
result,
next_key;
keys.shift();
next_key = keys.join('.');
if (!next_key) {
result = next;
} else {
result = find(next, next_key);
}
return result;
};
本文旨在记录js引用类型的一些核心概念
// 类型判断 arr instanceof Array; Array.isArray(arr); // 分析:由于第一种方式其实是通过原型链判断(即:arr.proto === Array.prototype),所以当数组在一个执行环境中创建,而传入另一个环境中时,此时原型链就不一致了(两个不同的全局环境,构造函数不一样),所以判断就会失败。 // 方法二则不会有这种问题
// toString, toLocaleString var person1 = { toString() { return 1; }, toLocaleString() { return 2; } }; var person2 = { toString() { return 3; }, toLocaleString() { return 4; } }; var person = [person1, person2]; person.toString(); // 调用每一项的toString, 然后‘,’分割 person.toLocaleString();// 调用每一项的toLocaleString, 然后‘,’分割
// 当数组的某一项为undefined时,进行拼接操作时(调用join、toString等方法)会处理为‘’ var arr = [1, , 2]; arr.join(); // '1,,2'
// sort(): 实际上先调用数组每一项的toString()方法,再比较字符串的编码值
数组方法
1)不会改变原素组的方法:concat、slice、forEach、every、filter、map、some 2)会改变原素组的方法:pop、push、shift、unshift、sort、reverse、splice
slice(start, end)
1)技巧: arr.slice(0, -1) // 返回除最后一项的数组 2)说明:start >= end 返回空数组
splice(start, count [,x,x])
1)始终返回一个数组,包含删除的元素 2)有三种作用:删除、替换、插入
位置方法:内部使用全等匹配
1)indexOf(findItem[, start]) 2)lastIndexOf(findItem[, start])
迭代方法:都不会改变原数组,且都会忽略空档元素
1)forEach:return undefined
获取当前时间毫秒数:+new Date() || Date.now()
valueOf():返回时间的毫秒数 (等价于 getTime())
setXXX相关方法都会改变原Date实例对象,且当值大于最大值时,往前进一位,例如: d.setMonth(13), 则增加年份
彻底领悟javascript中的exec与match方法:在全局模式下,match会返回所有匹配到项的数组,在不是全局模式下,match可以等价于exec 正则表达式中的贪婪和懒惰