42条JavaScript开发优化技巧,Activity的6大难点你会几个

!!“” === false // empty string is falsy

!!“foo” === true // non-empty string is truthy

!!“false” === true // …even if it contains a falsy value

!!window.foo === false // undefined is falsy

!!null === false // null is falsy

!!{} === true // an (empty) object is truthy

!![] === true // an (empty) array is truthy;

14、如何在JavaScript中循环遍历数组?

============================

我们有几种选择:

1)、顺序for循环:


var array = [“a”,“b”];

var arrayLength = array.length;

for (var i = 0; i < arrayLength; i++) {

console.log(“value”,array[i]);

}

2)、Array.prototype.forEach


const data = [“a”, “b”, “c”];

data.forEach(function (item, index) {

console.log(item, index);

});

3)、 ES6for-of声明


let data = [‘a’, ‘b’, ‘c’];

for (const a of data){

console.log(a);

}

15、如何使用JavaScript复制到剪贴板

===========================

通过执行以下操作,我们可以提示用户单击并输入:

function copy(text) {

window.prompt(“Copy to clipboard: Ctrl+C, Enter”, text);

}

现在,剪贴板复制操作为SAFE,因为用户单击了提示。

Copy here

16、如何测试一个空的JavaScript对象

===========================

有几种方法可以实现此功能。

1)、jQuery的:


jQuery.isEmptyObject({}); // true

2)、 lodash:


_.isEmpty({}); // true

3)、Underscore


_.isEmpty({}); // true

17、如何在JavaScript中使字符串的首字母大写

===============================

我们可以更新具有text-transform属性的CSS。

1)、在CSS中:

p:first {

text-transform:capitalize;

}

2)、使用函数,我们可以调用toUpperCase()方法。

function makeUpperCase(val)

{

return val && val[0].toUpperCase() + val.slice(1);

}

18、如何使用JavaScript更改元素的类?

============================

有很多需求,我们需要根据条件更改某些颜色或CSS。

如何在JavaScript中完成?

更改元素的所有类:

要将所有现有类替换为一个或多个新类,请设置className属性:

document.getElementById(“test”).className = “newclass”;

要将其他类添加到元素:

要将类添加到元素中而不删除或影响现有值,请添加空格和新的类名称,如下所示:

document.getElementById(“test”).className += " newClass";

要从元素中删除类:

要在元素中删除单个类而又不影响其他潜在类,则需要简单的正则表达式替换:

document.getElementById(“test”).className =

document.getElementById(“test”).className.replace

( /(?:^|\s)newClass(?!\S)/g , ‘’ )

19、是否可以将CSS应用于一半的字符?

================================

我们确实看到了一些精美的文字艺术,其中一半字符具有不同的颜色,而另一半字符具有不同的颜色,我们如何在CSS中实现这样的效果?

下面是使CSS适用于半角字符的示例。

h1 {

display: inline-block;

margin: 0; /* for demo snippet */

line-height: 1em; /* for demo snippet */

font-family: helvetica, arial, sans-serif;

font-weight: bold;

font-size: 300px;

background: linear-gradient(to right, #7db9e8 50%,#1e5799 50%);

-webkit-background-clip: text;

-webkit-text-fill-color: transparent;

}

XYZ

20、如何在数组中追加内容?

==================

在较早的JavaScript版本中,这是通过使用apply方法完成的。

该apply()方法调用具有给定this值的函数,并arguments以数组(或类似数组的对象)的形式提供。

let array1 = [33, 45, 5];

let array2 = [100, 2];

Array.prototype.push.apply(array2, array1);

console.log(array2); // [100, 2, 33, 45, 5]

使用ES6,可以使用扩展运算符完成此操作。

let array1 = [11, 42, 53];

let array2 = [1, 2];

array2.push(…array1);

console.log(array2); // [11, 2, 3, 42, 53]

21、如何检查对象是否为数组?

===================

当我们想检查对象是否为数组时,可以遵循以下选项。

let arr = [10,20,30,40,50];

Javascript(新旧浏览器):

function isArray(arr) {

return arr.constructor.toString().indexOf(“Array”) > -1;

}

function isArray(arr) {

return arr instanceof Array;

}

function isArray(arr) {

return Object.prototype.toString.call(arr) === ‘[object Array]’;

}

然后这样称呼它:

isArray(arr);

JavaScript(IE9 +,Ch5 +,FF4 +,Saf5 +,Opera10.5 +)

Array.isArray(arr);

下划线和Lodash:

_.isArray(arr);

22、如何检测未定义的对象属性?

====================

当我们想检查对象的特定属性是否未定义时,我们可以直接使用if条件和===运算符进行检查。

if(data.prop === undefined) {

alert(“it is: undefined”);

}

要检查对象是否实际上没有这样的属性,并尝试访问它时,默认情况下将返回undefined:

if(!o.hasOwnProperty(‘prop’)) {

alert("not exisiting);

}

检查与标识符关联的值是否为特殊值undefined,或者尚未声明该标识符。

if(typeof variable === ‘undefined’) {

alert(‘variable is undefined, or it is not declared’);

}

23、如何在JavaScript中将字符串转换为布尔值?

================================

有几种方法可以在JavaScript中将字符串转换为布尔值。

使用测试方法

var stringValue = “true”;

var boolValue = (/true/i).test(stringValue) //returns true

使用比较运算符

var val = “true”;

var boolValue = (val ==“true”); //returns true

使用JSON.parse

var val = “true”;

var boolValue = JSON.parse(val); //returns true

使用三元运算符

var val = “true”;

var boolValue = val.toLowerCase() == ‘true’ ? true : false; //returns true

使用 switch-case

var val = “true”;

var boolValue = getBoolean(val); //returns true

function getBoolean(value){

switch(value){

case true:

case “true”:

case 1:

case “1”:

case “on”:

case “yes”:

return true;

default:

return false;

}

}

24、如何获取JavaScript中的查询字符串值?

==============================

当我们处理URL参数并想从URL中提取信息时,这是最常见的用法。

下面是一些我们可以从中获取字符串值的方法。

ES2015(ES6):创建一种实现此功能的方法

getQueryStringParams = query => {

return query

? (/1/.test(query) ? query.slice(1) : query)

.split(‘&’)

.reduce((params, param) => {

let [key, value] = param.split(‘=’);

params[key] = value ? decodeURIComponent(value.replace(/+/g, ’ ')) : ‘’;

return params;

}, {}

)
{}

};

URLSearchParams从位置使用内置方法。

你可以在location以下位置使用它:

let params = new URLSearchParams(location.search);

let params = (new URL(location)).searchParams;

let url = new URL(‘https://abc.com?val1=1&val2=2’);

let params = new URLSearchParams(url.search);

我们还可以使用.searchParamsURL对象的简写属性来获取参数,如下所示:

let params = new URL(‘https://abc.com?val1=1&val2=2’).searchParams;

params.get(‘val1’); // “1”

params.get(‘val2’); // “2”

25、如何获取JavaScript对象的长度?

===========================

在大多数情况下,我们确实检查数组的长度,但是,如果要检查对象的长度怎么办?以下两种方法是获取对象长度的最佳方法。

1、使用ES6功能

let size = Object.keys(data).length;

2、使用下划线

_.size({val1 : 1, val2 : 2, val3 : 3});

26、如何反转包含复杂表情符号的字符串?

========================

当我们进行更多编程或遇到一些编码挑战时,这是其中最常见的问题。

我们可以使用lodash功能来解决这一挑战。

function reverse(txt) { return _.split(txt, ‘’).reverse().join(‘’); }

const data = ‘abc abc???’;

console.log(reverse(data));

27、如何在JavaScript中将字符串转换为对象数组?

=================================

当我们从无法控制的第三方API中获取一些数据时,就会出现这种情况。我们如何将字符串转换为对象数组以在我们的应用程序中使用?下面是实现此结果的最简单方法

const str = ‘Option 1|false|Option 2|false|Option 3|false|Option 4|true’;

data = [];

for (let i = 0, a= str.split(‘|’); i < a.length; i += 2) {

const

option = a[i],

value = JSON.parse(a[i + 1]);

data.push({ option, value });

}

console.log(data);

28、如何检测用户是否更改了JavaScript中的选项卡?

==================================

这可以通过JavaScript支持的最新事件侦听器功能来实现。

下面是处理选项卡状态的解决方案。

document .addEventListener(“visibilitychange”, event => {

if (document.visibilityState == “visible”) {

console.log(“activated”)

} else {

console.log(“inactivated”)

}

})

29、如何从一个对象数组求和一个属性值?

========================

当我们有一个包含一些数字的对象数组时,我们想在下面求和是带有reduce的解决方案。

const data = [

{ val1: ‘abc’, val2: 50 },

{ val1: ‘abc’, val2: 50 },

{ val1: ‘cde’, val2: 75 },

{ val1: ‘hji’, val2: 35 },

{ val1: ‘bbc’, val2: 25 },

];

console.log(data.reduce((n, {val2}) => n + val2, 0))

30、如何格式化JavaScript日期?

=========================

当我们格式化日期时,更令人头疼,因为我们确实根据需求有不同的要求。我们如何才能满足每个人的需求?以下是广泛用于在JavaScript中格式化日期的最常用方法。

1)、你可以使用本机 .toLocaleDateString()

例子:

new Date().toLocaleDateString() // 1/06/2021

new Date().toLocaleDateString(‘en-US’, {year: ‘numeric’, month: ‘2-digit’, day: ‘2-digit’}); // 01/06/2021 (month and day with two digits)

new Date().toLocaleDateString(‘en-ZA’); // 2020/01/06(year/month/day) notice the different locale

new Date().toLocaleDateString(‘en-CA’); // 2021-01-06 (year-month-day) notice the different locale

new Date().toLocaleString(“en-US”, {hour: ‘2-digit’, hour12: false, timeZone: “America/New_York”}); // 07 (just the hour)

2)、我们可以使用moment.js

var now = new Date();

var dateString = moment(now).format(‘YYYY-MM-DD’);

var dateStringWithTime = moment(now).format(‘YYYY-MM-DD HH:mm:ss’);

31、如何在JavaScript中生成随机字符串/字符?

================================

很多时候,我们需要向后端发送一些随机的唯一ID。实现此功能的解决方案有成千上万种,但以下是我最喜欢的一种。

生成一个安全的随机字母数字Base-62字符串:

function generateUID(length)

{

return window.btoa(Array.from(window.crypto.getRandomValues(new Uint8Array(length * 2))).map((b) => String.fromCharCode(b)).join(“”)).replace(/[+/]/g, “”).substring(0, length);

}

console.log(generateUID(22)); // “cFg3Upv2cE5cK8Xd7hHwWp”

console.log(generateUID(5)); // “CAGkP”

32、在字段中输入3个字符后如何执行API调用?

============================

当我们要搜索用户名或某个已经存在的值但又要避免一直调用时,我们经常要等到用户键入某些字符后再调用API,这是最常用的方法。

这可以使用distinctUntilChanged来实现,并且你可以使用filter。

this.service.getData(data)

.pipe(

filter(_ => data.length === 3),

distinctUntilChanged()

).subscribe(rs => console.log(rs));

33、如何重命名数组内的对象键?

====================

有时我们需要更改键来操作数据。这是在数组中重命名对象键的有效方法之一。

你可以使用Object.values()它来检索值,然后array.reduce()组成一个新的对象:

const data = [{

prop_name: ‘test1’,

prop_age: 45,

prop_email: ‘test1@test.com’,

},

{

prop_name: ‘test2’,

prop_age: 41,

prop_email: ‘test2@test.com’,

},

{

prop_name: ‘test3’,

prop_age: 45,

prop_email: ‘test3@test.com’,

},

];

const newKey = [

‘firstname’,

‘age’,

‘email’

];

let resultData = data.map(obj =>

Object.values(obj).reduce((acc, cur, i) => {

acc[newKey[i]] = cur;

return acc;

}, {}));

console.log(resultData);

34、如何清除javascript中的焦点?

==========================

焦点…焦点…是的,这一次,我们想从HTML中的特定元素中清除焦点。这可以通过模糊方法来实现。

if (document.activeElement instanceof HTMLElement)

document.activeElement.blur();

35、JavaScript中的二进制到字符串

==========================

如果我们有一些二进制代码,并且想要在将其用于代码之前将其转换为字符串,该怎么办?可以使用fromCharCode方法实现。

let binary = `1010011 1110100 1100001 1100011 1101011

1001111 1110110 1100101 1110010 1100110

1101100 1101111 1110111`;

let newData = binary.split(’ ') //Split string in array of binary chars

.map(bin => String.fromCharCode(parseInt(bin, 2))) //Map every binary char to real character

.join(‘’); //Join the array back to a string

console.log(newData);

36、移位字符串在JavaScript中向左和向右循环

===============================

这种javascript编码问题很常见。这是基于给定值移动字符串的示例。可以使用数组切片方法来实现。

function getShiftedString(s, leftShifts, rightShifts) {

// using split('') will result in certain unicode characters being separated incorrectly

// use Array.from instead:

const arr = Array.from(s);

const netLeftShifts = (leftShifts - rightShifts) % arr.length;

return […arr.slice(netLeftShifts), …arr.slice(0, netLeftShifts)]

.join(‘’);

}

console.log([

getShiftedString(‘abc’, 0, 0),

getShiftedString(‘abc’, 1, 0),

getShiftedString(‘abc’, 0, 1),

getShiftedString(‘abc’, 1, 1),

getShiftedString(‘123456789’, 0, 0),

getShiftedString(‘123456789’, 1, 5),

getShiftedString(‘123456789’, 5, 1),

‘----’,

getShiftedString(‘123456789’, 9, 0),

getShiftedString(‘123456789’, 10, 0),

getShiftedString(‘123456789’, 0, 9),

getShiftedString(‘123456789’, 0, 10),

getShiftedString(“???❤”, 0, 0),

getShiftedString(“???❤”, 1, 0),

]);

37、检查IP地址的正则表达式JavaScript

=============================

正则表达式可帮助我们检查任何特定的字符串并为我们验证?如果我们要使用正则表达式作为IP地址该怎么办。我在这里喜欢Mahdi Pedram解决方案来实现这一目标。

这是验证IP地址的最干净的方法,下面将其分解:

事实:一个有效的IP地址具有4 octets,每个八位字节可以是一个介于0 - 255

正则表达式的细分,该正则表达式匹配之间的任何值 0 - 255

  • 25[0-5] matches 250 - 255

  • 2[0-4][0-9] matches200 - 249

  • 1[0-9][0-9] matches 100 - 199

  • [1-9][0-9]? matches 1 - 99

  • 0 matches 0

const octet = ‘(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)’;

注意:使用new RegExp时应使用\\.而不是\.因为字符串将被转义两次。

function isValidIP(str) {

const octet = ‘(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)’;

const regex = new RegExp(^${octet}\\.${octet}\\.${octet}\\.${octet}$);

return regex.test(str);

}

38、如何用JSON对JavaScript日期进行字符串化并保留时区

======================================

当我们要将任何特定的日期格式值存储到JSON时。使用此功能可以实现。

var changeValue = function(key, value) {

if (this[key] instanceof Date) {

return this[key].toUTCString();

}

return value;

}

console.log(JSON.stringify(new Date(), changeValue));

console.log(JSON.stringify({ myProperty: new Date()}, changeValue));

39、JavaScript检查字符串是否为有效数字

=============================

我们已经看到了很多解决方案来检查数字是否有效,但是如果要检查字符串是否是有效数字怎么办?

这是最好的方法。

function isNumeric(n) {

return !isNaN(parseFloat(n)) && isFinite(n);

}

以下是一些很好的测试用例:

console.log(isNumeric(123456898898912345678912)); // true

console.log(isNumeric('2 ')); // true

console.log(isNumeric('-42.2 ')); // true

console.log(isNumeric(-562.2)); // true

console.log(isNumeric(undefined)); // false

console.log(isNumeric(‘’)); // false

console.log(isNumeric(null)); // false

console.log(isNumeric([])); // false

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

文末

js前端的重头戏,值得花大部分时间学习。

JavaScript知识

推荐通过书籍学习,《 JavaScript 高级程序设计(第 4 版)》你值得拥有。整本书内容质量都很高,尤其是前十章语言基础部分,建议多读几遍。

前端电子书

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。

学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。

面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。

这是288页的前端面试题

288页面试题

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

减轻大家的负担。**
[外链图片转存中…(img-KxNi2nV0-1712139497164)]
[外链图片转存中…(img-G02PelEB-1712139497165)]
[外链图片转存中…(img-pjjlMrJm-1712139497166)]
[外链图片转存中…(img-6MJxUkox-1712139497166)]
[外链图片转存中…(img-yNgMrF40-1712139497166)]
[外链图片转存中…(img-6cXvYPlo-1712139497166)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-BZDo3yEp-1712139497167)]

文末

js前端的重头戏,值得花大部分时间学习。

JavaScript知识

推荐通过书籍学习,《 JavaScript 高级程序设计(第 4 版)》你值得拥有。整本书内容质量都很高,尤其是前十章语言基础部分,建议多读几遍。

前端电子书

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

另外,大推一个网上教程 现代 JavaScript 教程 ,文章深入浅出,很容易理解,上面的内容几乎都是重点,而且充分发挥了网上教程的时效性和资料链接。

学习资料在精不在多,二者结合,定能构建你的 JavaScript 知识体系。

面试本质也是考试,面试题就起到很好的考纲作用。想要取得优秀的面试成绩,刷面试题是必须的,除非你样样精通。

这是288页的前端面试题

288页面试题

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算


  1. ?# ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值