javascript基础扎实了,但是很多逻辑性的功能还是不会写?

怎么办呢?是逻辑思维不强吗?比如一个功能用的知识都是我掌握的,但我就是写不出那个代码,咋么办?

阅读 14.2k
19 个回答

=======================序
不好意思,恐怕我在当前最高票答案里起了推波助澜的负面作用。不可否认,高票答案具备一定的煽动力,这也是为什么他能高票的原因(很多人在这里找到了共鸣)。或许你可能不信(或者没见过),圈子里的确有不少人是属于“活在自己世界里的人”,以为自己知道的那一丁点内容就可以解释世间万物,这就是我们常说的,“越无知越自信”。题主被调侃,也就是因为那句“javascript基础扎实了”。

这里我想应该代表所有调侃题主的朋友道个歉,因为题主既然来问问题了,说明并不是狂妄之辈,还在寻求真理,这个真心值得赞扬而不是嘲讽!

=======================正文

那好,我们现在言归正传来聊聊你的问题。你的问题的本质,应该是“理论是如何与实际相结合的”,你说的扎实想必是指已经学习了很多语法及api,“逻辑功能写不出”其实就是不知道理论知识该如何应用到实际项目中。

理论结合实际的一开始是困难的,但却不是没有办法,最重要的手段就是“看”,一定要多看别人的项目(这时候你可能分不清项目的好坏),尽量找完整能运行,代码不多且结构清晰的看,譬如单文件组件下的vue,可以擦出怎样的火花(原谅我给自己做了广告),所谓“书读百遍、其义自现”就是这个道理,如果不看别人写的,就那么从无到有的冥想,天知道什么时候能出师!

看是有门道的,不能瞎看。对照别人要解决的问题,先自己思考,如果是你写,从哪里着手,难点都在哪里,你要怎么解决,项目是否发布,如何发布?。。。。然后对照这些点,逐一在别人的代码里寻求答案,如果这时候有余力,说不定你会发现针对某一问题,你能想出更好的方案来挑战原作者(当然开源社区我们管这叫交流,不叫互相伤害^^)

接下来一个重要的环节是难度分解,当我们面对一个复杂问题时,刚入行/门的朋友往往会被问题吓倒,这是源于方法论不足。(学霸可能除外,这帮人上学时多数都训练出来一套成熟的适于自己的方法论)。如果能够掌握一定的技巧,那么解决复杂问题并不可怕,这里可以看如何成为一名优秀的设计师:罗子雄@TEDxChongqing(虽然是关于设计的演讲,但复杂问题的分解是通用方法,你可以的)

然后我们来举个简单的例子,试图以此说明分解的作用

假设我们现在来了一个“按照类型来过滤数据,并且不同类型的具体过滤规则不一样”的需求

现有数据如下:

//一份城市信息,包含城市名称,面积,人口
var cities = [
    {
        name: 'Shanghai',
        size: 6340,
        population: 2426
    },
    {
        name: 'Beijing',
        size: 16410,
        population: 2152
    }, {
        name: 'Tianjin',
        size: 11946,
        population: 1517
    }, {
        name: 'Shenzhen',
        size: 1996,
        population: 2000
    }
];

然后目前已知的过滤类型有:

  • START_S,过滤名称首字母不为S的数据

  • SIZE_B,过滤面积小于10000的数据

  • POPU_M,过滤人口大于2000,或者小于1500的数据

未来可能继续增加过滤类型,这是作为PM,给你的需求"隐患"

有了如上信息,这个过滤功能你要怎么结合理论知识?这就是抽丝剥茧的开始了。

第一步,先抓骨架,到底理论知识里哪个点是解决该问题的关键呢?“数组过滤”,我去,你是不是想到了Array.prototype.filter?好 high!!不过如何使得filter能够满足我们需求的多样性呢?我们稍后分解

第二部,挑逻辑部分,也就是核心过滤入手,分别写出每一种类型的过滤函数来,

//START_S
var fitlerStartS = function(city) {
    return city.name.indexOf('S') === 0;
};

//SIZE_B
var fitlerSizeB = function(city) {
    return city.size >= 10000;
};

//POPU_M
var fitlerPopuM = function(city) {
    return city.population >= 1500 && city.population <= 2000;
};

相信上面三个函数都难不倒你,及其简单

最后再来,合成一个完整的功能,往往这个步骤也是最让人迷惑的,(所以才要多看)。或许你已经想到了switch caseif else的解决方案,但这还没有达到你期望的程度,在Javascript里,我们通常建议使用literal object来替代那些传统的、不易维护的、难以阅读甚至是低效的流程控制语句。可以写作:

var filterMapping = {
    START_S: fitlerStartS,
    SIZE_B: fitlerSizeB,
    POPU_M: fitlerPopuM
};

var filter = function(arr, type) {
    return arr.filter(filterMapping[type]);
};

最后来检验结果:

console.log(filter(cities, 'START_S'));//[ { name: 'Shanghai', size: 6340, population: 2426 }, { name: 'Shenzhen', size: 1996, population: 2000 } ]

console.log(filter(cities, 'SIZE_B'));//[ { name: 'Beijing', size: 16410, population: 2152 }, { name: 'Tianjin', size: 11946, population: 1517 } ]

console.log(filter(cities, 'POPU_M'));//[ { name: 'Tianjin', size: 11946, population: 1517 },{ name: 'Shenzhen', size: 1996, population: 2000 } ]

经历了上述过程,当你掌握了一定技巧之后,就算顺利上路了。预祝题主一路平安^^

能说自己JavaScript基础扎实的,一般有一年以下编程经验或者五年以上。

编程经验不是你掌握了多少种语言,而是你解决过多少问题。

不存在你会的语法和api,只有熟知的语法和方法。在非闭卷考试环境下,看了认识还不如搜索后大致理解。真的熟悉一门机器语言不是像你这样的,应该是像熟悉一门自然语言一样,可以描述自己想要描述的东西。你的状况就跟扫盲班出来的老大爷看文言文一样,字都认识,就是不知道说了啥。

先搞清楚什么是基础,新手入门的立马上手复杂点的功能是比较困难的,可以把功能切分成多个模块,先部分,再整体。

孔子曰: 学而不思则罔,思而不学则殆

最基本的会了,多看一些小基础案例,然后从中学会如何扩展

第一次遇到写不出来很正常,了解代码之后就要知道原理啊,然后能举一反三,下次遇到类似的就有思路了啊。

你确定基础扎实了?javascript有那么多api,多去看看,然后多做多思考吧,你还需要一定的积累。

javascript mdn 好好看几遍。?

新手上路,请多包涵

乘法口诀背的很熟,但是依然不会解方程。编程语言只是工具,怎么使用还是得自己去思考和练习,多看看写小效果的视频或教程,重点在于听别人的思路,效果的逻辑是怎么实现出来的,如果觉得自己能明白这个效果的关键逻辑,那么在自己试着写写,花些时间绝对可以写出来,而且不会只是一种方法实现。
总结:“在没有任何思路的情况下,参考、学习别人的思路”

说一个做不出来的

大神们不要喷我,我啥都懂啥都不会,算不算候选大神!

看你之前提过的问题,离扎实两字还相差很远。
在学习js基础时不仅要看,还要练,这是学习的基本方法。

别听楼上谢谢喷子, 对于新手(或者某领域的新人)最重要的是多看, 多模仿; 你找点简单的代码看一下, 见的多了就知道别人怎么做的了, 自然就没这种感觉了;

编程无非三个字:看、思、练。
或者说:动眼、动脑、动手。
看一下你三点都做好了没。

各行各业都是这样。

  • 学医的八年本硕博出来就能顺利完成各种手术?

  • 学土木的毕业了就能指导施工建设?

  1. practice,为了熟练相关skill

  2. 跟项目,学解决问题的常用套路

就像认识了所有的汉字和写一篇优秀文章的距离。

逻辑思维的东西,我想应该靠多写代码来弥补,我想多接触技术书籍也有助你扩展你的思路,比如《head first 设计模式》,看看《dom javascript高级编程》;看到一些小巧的开源项目也可以看看;另外学习一下软件工程类的东西,比如说多画画流程图、时序图之类的东西对于编程思维的整理很有用。

推荐问题
宣传栏