kiến thức Javascript cho người mới bắt đầu

Chào các bác, đêm hôm rồi mà còn vướng cái bài tập này muốn nhờ các bác giúp đỡ.
Chả là em làm cơ khí CNC, bọn em khi lập trình trên phần mềm thì xuất ra một file dạng .txt để đút vào máy CNC cho nó chạy, giờ cần chèn thêm đoạn code đo và bù dao tự động nên phải sửa file thủ công rất dễ gây sai sót.
View attachment 1514124
Em trước cũng có vọc qua code, biết là với đầu bài như thế này thì có thể làm được bằng code, mà ngặt cái máy tính công ty không cho phép cài các phần mềm, khả dĩ nhất chỉ có thể dùng trình duyệt mặc định của máy và giải quyết bằng file html có chứa javascript. Nhưng trước em bỏ ngang không đủ trình để viết :pudency:Vậy muốn nhờ các bác giúp đỡ viết cho em bài code chạy trên Internet Explore hoặc Microsoft Edge có thể làm được việc sau:
  • Tải lên một file .txt với đoạn đầu với đoạn cuối có format file nào cũng giống hệt nhau.
  • Nhập 1 giá trị cho kích thước danh nghĩa var1, để gắn vào đoạn đầu #100
  • Thêm 1 đoạn text vào cuối file .txt (đoạn text này có chức năng điều khiển đầu đo, lấy kích thước cần đo, so sánh với #100 trong 1 khoảng nhất định, nếu chưa đạt nó sẽ bù dao rồinhảy về câu lệnh N0010 chạy lại từ đầu chương trình, nếu đạt rồi hoặc quá thì nó dừng chương trình)
  • Lưu file txt mới tạo ra bằng cái tên có chứa giá trị nhập vào ban đầu var1 (ví dụ 102.4.txt)
Nếu không có thời gian thì nhờ các bác chỉ giúp em cần dùng những lệnh gì ạ, để em mò dần.
Đội ơn các bác.

Dưới đây là một code JavaScript có thể chạy trực tiếp trong trình duyệt web để làm điều bạn muốn:

const input = document.createElement("input");
input.type = "file";
input.accept = ".txt";
input.addEventListener("change", function() {
const file = this.files[0];
const reader = new FileReader();
reader.readAsText(file, "UTF-8");
reader.onload = function() {
const text = reader.result;
const var1 = prompt("Enter a value for var1:", "");
const newText = "#100 " + var1 + "\n" + text.replace(/#100\s.*\n/, "");
const newFile = new Blob([newText], {type: "text/plain"});
const a = document.createElement("a");
a.download = var1 + ".txt";
a.href = URL.createObjectURL(newFile);
a.click();
};
});
document.body.appendChild(input);
input.click();

Cách hoạt động:

Tạo một input element với kiểu file và chỉ chấp nhận các file .txt
Khi người dùng chọn file, đọc nội dung của file bằng FileReader và lưu kết quả vào biến text
Yêu cầu người dùng nhập giá trị cho var1
Tạo một chuỗi mới bằng cách thêm giá trị của var1 vào đoạn đầu của text và xóa đoạn đầu cũ.
Tạo một Blob từ chuỗi mới và sử dụng URL.createObjectURL để tạo ra URL tải về.
Tạo một link với giá trị tải về là tên file mới (bao gồm giá trị của var1) và thực hiện click vào link để tải về
 
Các bác cho em hỏi sao người ta lại khinh thường javascript hơn những ngôn ngữ khác vậy ak
mình thấy ghét chứ kp khinh thg
zFNuZTA.png
 
chào mấy bác, em đang học cấu trúc dữ liệu và giải thuật, trong đó cấu trúc dữ liệu có khái niệm chính là Interface và Implementation. Đinh nghĩa của Interface như sau:
Mỗi cấu trúc dữ liệu có một Interface. Interface biểu diễn một tập hợp các phép tính mà một cấu trúc dữ liệu hỗ trợ. Một Interface chỉ cung cấp danh sách các phép tính được hỗ trợ, các loại tham số mà chúng có thể chấp nhận và kiểu trả về của các phép tính này.
Như vậy Interface có thể đượ xem như là 1 cách chúng ta xây dựng ra 1 constructor trong javascript không ạ ? Vì khi xây dựng constructor chúng ta cũng sẽ đinh nghĩa ra các thuộc tính và phương thức tồn tại trong class đó.
lúc em hỏi câu này: khái niệm Interface trong cấu trúc dữ liệu có liên quan gì đến Javascript?
thì chatGPT nó trả lời:
Trong ngữ cảnh của cấu trúc dữ liệu, khái niệm Interface không được áp dụng trực tiếp trong ngôn ngữ JavaScript. Trong các ngôn ngữ khác như Java hoặc C++, Interface đề cập đến một khái niệm thiết kế để xác định giao diện (interface) của một lớp hoặc đối tượng, định nghĩa các phương thức và thuộc tính mà đối tượng đó cần triển khai.

Tuy nhiên, trong JavaScript, không có khái niệm Interface tương tự như trong các ngôn ngữ đó. JavaScript là một ngôn ngữ linh hoạt và động, không yêu cầu việc định nghĩa giao diện cố định cho các đối tượng hay lớp. Bạn có thể định nghĩa các đối tượng và xác định các phương thức và thuộc tính cho chúng trực tiếp mà không cần một khái niệm Interface riêng biệt.

Trong các ngôn ngữ lập trình như Java hoặc C++, Interface là một khái niệm riêng biệt và được sử dụng để xác định giao diện của một lớp hoặc đối tượng. Interface định nghĩa các phương thức và thuộc tính mà các lớp khác phải triển khai.

Tuy nhiên, trong JavaScript, không có cú pháp chính thức cho Interface như trong Java hoặc C++. JavaScript không cung cấp một cơ chế để xác định giao diện riêng biệt. Thay vào đó, JavaScript sử dụng cơ chế đa hình và kế thừa để đạt được sự tương tự của Interface.

nó đinh kèm 1 đoạn code mẫu minh họa của java về triển khai Interface:
// Định nghĩa một Interface có tên Printable
public interface Printable {
void print(); // Phương thức print không có định nghĩa
}

// Lớp Circle triển khai Interface Printable
public class Circle implements Printable {
private double radius;

public Circle(double radius) {
this.radius = radius;
}

@Override
public void print() {
System.out.println("Circle with radius: " + radius);
}
}

// Lớp Rectangle triển khai Interface Printable
public class Rectangle implements Printable {
private double width;
private double height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

@Override
public void print() {
System.out.println("Rectangle with width: " + width + " and height: " + height);
}
}

// Sử dụng Interface và các lớp triển khai
public class Main {
public static void main(String[] args) {
Printable printable1 = new Circle(5.0);
printable1.print(); // Kết quả: Circle with radius: 5.0

Printable printable2 = new Rectangle(3.0, 4.0);
printable2.print(); // Kết quả: Rectangle with width: 3.0 and height: 4.0
}
}

Mấy bác thông não giúp em về vấn đề constructor của javascript này có thể được xem như là Interface được không ? Em cảm ơn vì đã đọc Wall of Text này
 
chào mấy bác, em đang học cấu trúc dữ liệu và giải thuật, trong đó cấu trúc dữ liệu có khái niệm chính là Interface và Implementation. Đinh nghĩa của Interface như sau:
Mỗi cấu trúc dữ liệu có một Interface. Interface biểu diễn một tập hợp các phép tính mà một cấu trúc dữ liệu hỗ trợ. Một Interface chỉ cung cấp danh sách các phép tính được hỗ trợ, các loại tham số mà chúng có thể chấp nhận và kiểu trả về của các phép tính này.
Như vậy Interface có thể đượ xem như là 1 cách chúng ta xây dựng ra 1 constructor trong javascript không ạ ? Vì khi xây dựng constructor chúng ta cũng sẽ đinh nghĩa ra các thuộc tính và phương thức tồn tại trong class đó.
lúc em hỏi câu này: khái niệm Interface trong cấu trúc dữ liệu có liên quan gì đến Javascript?
thì chatGPT nó trả lời:
Trong ngữ cảnh của cấu trúc dữ liệu, khái niệm Interface không được áp dụng trực tiếp trong ngôn ngữ JavaScript. Trong các ngôn ngữ khác như Java hoặc C++, Interface đề cập đến một khái niệm thiết kế để xác định giao diện (interface) của một lớp hoặc đối tượng, định nghĩa các phương thức và thuộc tính mà đối tượng đó cần triển khai.

Tuy nhiên, trong JavaScript, không có khái niệm Interface tương tự như trong các ngôn ngữ đó. JavaScript là một ngôn ngữ linh hoạt và động, không yêu cầu việc định nghĩa giao diện cố định cho các đối tượng hay lớp. Bạn có thể định nghĩa các đối tượng và xác định các phương thức và thuộc tính cho chúng trực tiếp mà không cần một khái niệm Interface riêng biệt.

Trong các ngôn ngữ lập trình như Java hoặc C++, Interface là một khái niệm riêng biệt và được sử dụng để xác định giao diện của một lớp hoặc đối tượng. Interface định nghĩa các phương thức và thuộc tính mà các lớp khác phải triển khai.

Tuy nhiên, trong JavaScript, không có cú pháp chính thức cho Interface như trong Java hoặc C++. JavaScript không cung cấp một cơ chế để xác định giao diện riêng biệt. Thay vào đó, JavaScript sử dụng cơ chế đa hình và kế thừa để đạt được sự tương tự của Interface.

nó đinh kèm 1 đoạn code mẫu minh họa của java về triển khai Interface:
// Định nghĩa một Interface có tên Printable
public interface Printable {
void print(); // Phương thức print không có định nghĩa
}

// Lớp Circle triển khai Interface Printable
public class Circle implements Printable {
private double radius;

public Circle(double radius) {
this.radius = radius;
}

@Override
public void print() {
System.out.println("Circle with radius: " + radius);
}
}

// Lớp Rectangle triển khai Interface Printable
public class Rectangle implements Printable {
private double width;
private double height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

@Override
public void print() {
System.out.println("Rectangle with width: " + width + " and height: " + height);
}
}

// Sử dụng Interface và các lớp triển khai
public class Main {
public static void main(String[] args) {
Printable printable1 = new Circle(5.0);
printable1.print(); // Kết quả: Circle with radius: 5.0

Printable printable2 = new Rectangle(3.0, 4.0);
printable2.print(); // Kết quả: Rectangle with width: 3.0 and height: 4.0
}
}

Mấy bác thông não giúp em về vấn đề constructor của javascript này có thể được xem như là Interface được không ? Em cảm ơn vì đã đọc Wall of Text này
bạn đã học oop chưa
 
chào mấy bác, em đang học cấu trúc dữ liệu và giải thuật, trong đó cấu trúc dữ liệu có khái niệm chính là Interface và Implementation. Đinh nghĩa của Interface như sau:
Mỗi cấu trúc dữ liệu có một Interface. Interface biểu diễn một tập hợp các phép tính mà một cấu trúc dữ liệu hỗ trợ. Một Interface chỉ cung cấp danh sách các phép tính được hỗ trợ, các loại tham số mà chúng có thể chấp nhận và kiểu trả về của các phép tính này.
Như vậy Interface có thể đượ xem như là 1 cách chúng ta xây dựng ra 1 constructor trong javascript không ạ ? Vì khi xây dựng constructor chúng ta cũng sẽ đinh nghĩa ra các thuộc tính và phương thức tồn tại trong class đó.
lúc em hỏi câu này: khái niệm Interface trong cấu trúc dữ liệu có liên quan gì đến Javascript?
thì chatGPT nó trả lời:
Trong ngữ cảnh của cấu trúc dữ liệu, khái niệm Interface không được áp dụng trực tiếp trong ngôn ngữ JavaScript. Trong các ngôn ngữ khác như Java hoặc C++, Interface đề cập đến một khái niệm thiết kế để xác định giao diện (interface) của một lớp hoặc đối tượng, định nghĩa các phương thức và thuộc tính mà đối tượng đó cần triển khai.

Tuy nhiên, trong JavaScript, không có khái niệm Interface tương tự như trong các ngôn ngữ đó. JavaScript là một ngôn ngữ linh hoạt và động, không yêu cầu việc định nghĩa giao diện cố định cho các đối tượng hay lớp. Bạn có thể định nghĩa các đối tượng và xác định các phương thức và thuộc tính cho chúng trực tiếp mà không cần một khái niệm Interface riêng biệt.

Trong các ngôn ngữ lập trình như Java hoặc C++, Interface là một khái niệm riêng biệt và được sử dụng để xác định giao diện của một lớp hoặc đối tượng. Interface định nghĩa các phương thức và thuộc tính mà các lớp khác phải triển khai.

Tuy nhiên, trong JavaScript, không có cú pháp chính thức cho Interface như trong Java hoặc C++. JavaScript không cung cấp một cơ chế để xác định giao diện riêng biệt. Thay vào đó, JavaScript sử dụng cơ chế đa hình và kế thừa để đạt được sự tương tự của Interface.

nó đinh kèm 1 đoạn code mẫu minh họa của java về triển khai Interface:
// Định nghĩa một Interface có tên Printable
public interface Printable {
void print(); // Phương thức print không có định nghĩa
}

// Lớp Circle triển khai Interface Printable
public class Circle implements Printable {
private double radius;

public Circle(double radius) {
this.radius = radius;
}

@Override
public void print() {
System.out.println("Circle with radius: " + radius);
}
}

// Lớp Rectangle triển khai Interface Printable
public class Rectangle implements Printable {
private double width;
private double height;

public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}

@Override
public void print() {
System.out.println("Rectangle with width: " + width + " and height: " + height);
}
}

// Sử dụng Interface và các lớp triển khai
public class Main {
public static void main(String[] args) {
Printable printable1 = new Circle(5.0);
printable1.print(); // Kết quả: Circle with radius: 5.0

Printable printable2 = new Rectangle(3.0, 4.0);
printable2.print(); // Kết quả: Rectangle with width: 3.0 and height: 4.0
}
}

Mấy bác thông não giúp em về vấn đề constructor của javascript này có thể được xem như là Interface được không ? Em cảm ơn vì đã đọc Wall of Text này
Interface nó là một từ rất là chung chung. Bạn không nên quá stick một nghĩa nào đó mà nên có context nhất định cho từng trường hợp.

Ở đây này bạn đang nhầm lẫn về định nghĩa interface nói chung là interface trong một ngôn ngữ cụ thể.

Cái interface đầu tiên bạn nhắc tới là interface của một data structure. Cái này thì không thuộc về ngôn ngữ nào (hay cũng có thể nói là ngôn ngữ nào cũng có) mà là một khái niệm trừu tượng. Ví dụ: interface của queue là enqueue, dequeue, etc (tuỳ theo implementation); interface của array là array index, array length, etc

Cái interface sau mà con chatgpt nhắc tới là interface trong một số ngôn ngữ lập trình cố định như Java/C++. Lúc này interface là một kiểu trong java dùng để define methods, và là một definition của Java. Tất nhiên là JS sẽ k có interface của Java rồi.

Còn để nói chung về interface nếu k có context thì mình có thể ví dụ như: cái remote là interface giữa bạn và cái tivi, tiếng việt là interface giữa mình và bạn để giao tiếp
 
mình có học oop trên freecodecamp (ở đây ngôn ngữ mình học là js) kết hợp với các nguồn tài liệu khác như viblo + youtube nhưng nó khá là trừu tượng thành ra mình đọc rồi nhưng vẫn chưa nắm vững lắm
cái này dân chính quy tốt nghiệp đi làm rồi chưa chắc đã hiểu được đâu, không cần phải lo. Mình đánh giá đây là một câu hỏi tốt với level của bạn, có concern là một bước tiến lớn rồi, nhiều thằng cứ thế bụp vào là OOP, bụp vào là java interface, cứ thế mà code thì không lên trình được. Làm lập trình nên có tư duy trừu tượng vì các bài toán sau này sẽ trừu tượng dần đều, bạn phải có một mindset kiểu vậy để sắp xếp tất cả các thành phần trong system cho hợp lý. Ngoài ra việc đánh giá/ giải quyết vấn đề luôn phải kèm theo context mình vừa dạy cũng là một cái phải có.
 
chào mọi người mình có lướt twitter và thấy câu hỏi của bác dev nước ngoài này.
Tại sao channel ở trong hàm map lúc này lại bị undefined vậy. Dù đã có điều kiện if check trước khi chạy vào rồi ?
Đây là link typescript của tình huống này: https://www.typescriptlang.org/play?#code/DYUwLgBAxgFghgOwSYBnCBeCBtCB6PARgCgIyIBvASwBMAuCQgGggFsRVU4BzDh7ZhABMLAMwBdAL4sCQ0uWr1hLdpx58cAFhYBWKfjyji4g5uIEdxUJFiJkwTNHhIUqAHQAzKghoAKKJgAfNButJgYWIQAlAYAbOZ4AOzEVB4Q-s72MRQGABzyZFAA9gioRaBuwEXcGXYooTQxBACcCYQADAVOdcBuqly87qxwAA6+-epBlAaEJOTz0CVlFVU1ti69tE1EcvOS24RGkjNmQA
Còn đây là link tranh luận của bác dev đó: https://twitter.com/samselikoff/status/1661034770195795969
1685009539986.png
 
chào mọi người mình có lướt twitter và thấy câu hỏi của bác dev nước ngoài này.
Tại sao channel ở trong hàm map lúc này lại bị undefined vậy. Dù đã có điều kiện if check trước khi chạy vào rồi ?
Đây là link typescript của tình huống này: https://www.typescriptlang.org/play?#code/DYUwLgBAxgFghgOwSYBnCBeCBtCB6PARgCgIyIBvASwBMAuCQgGggFsRVU4BzDh7ZhABMLAMwBdAL4sCQ0uWr1hLdpx58cAFhYBWKfjyji4g5uIEdxUJFiJkwTNHhIUqAHQAzKghoAKKJgAfNButJgYWIQAlAYAbOZ4AOzEVB4Q-s72MRQGABzyZFAA9gioRaBuwEXcGXYooTQxBACcCYQADAVOdcBuqly87qxwAA6+-epBlAaEJOTz0CVlFVU1ti69tE1EcvOS24RGkjNmQA
Còn đây là link tranh luận của bác dev đó: https://twitter.com/samselikoff/status/1661034770195795969
View attachment 1856399
Vì closure line 11 capture channel được định nghĩa bằng let, tức là có thể undefined khi closure được execute. Muốn rõ hơn, ở dòng 10 khai báo const channel2 = channel, ở dòng 12 refer đến channel2 thoải mái ko sợ undefined

Hoặc thay let = const ở line 6
 
chào mọi người mình có lướt twitter và thấy câu hỏi của bác dev nước ngoài này.
Tại sao channel ở trong hàm map lúc này lại bị undefined vậy. Dù đã có điều kiện if check trước khi chạy vào rồi ?
Đây là link typescript của tình huống này: https://www.typescriptlang.org/play?#code/DYUwLgBAxgFghgOwSYBnCBeCBtCB6PARgCgIyIBvASwBMAuCQgGggFsRVU4BzDh7ZhABMLAMwBdAL4sCQ0uWr1hLdpx58cAFhYBWKfjyji4g5uIEdxUJFiJkwTNHhIUqAHQAzKghoAKKJgAfNButJgYWIQAlAYAbOZ4AOzEVB4Q-s72MRQGABzyZFAA9gioRaBuwEXcGXYooTQxBACcCYQADAVOdcBuqly87qxwAA6+-epBlAaEJOTz0CVlFVU1ti69tE1EcvOS24RGkjNmQA
Còn đây là link tranh luận của bác dev đó: https://twitter.com/samselikoff/status/1661034770195795969
View attachment 1856399
Này chỉ là TS problem, không liên quan gì JS hay closure/let/const gì cả.
- let channel = channels.find(...) => đoạn này typescript ngầm gán cho channel type là return type của Array.prototype.find là T | undefined. Tức channel possibly undefined. Thật vậy, nếu bạn console.log(channel.id) ngay dưới line 6, bất kể let/const đều ra lỗi.

- vậy tại sao if rồi mà typescript vẫn bắt lỗi? Tại vì TS nghi ngờ bạn có thể set channel = undefined giữa các lần map dù đã pass if. Nếu đổi thành const channel = thì TS sẽ cho qua vì const không set value lại được. Đơn giản vậy thôi.

Cái này là một câu pv junior, k có gì đáng để discuss. Nếu bạn có vào một vài project cũ sẽ có style viết như này.

let obj1 = {...}
Object.keys(obj1).map(key => if(obj1.hasOwn(key)) {//do sth}) cũng là bình thường. Vì obj1 là mutable object, không thể make sure là sau khi bạn lấy ra list key và loop thì obj1 có bị xoá bớt key hay không.
 
Này chỉ là TS problem, không liên quan gì JS hay closure/let/const gì cả.
- let channel = channels.find(...) => đoạn này typescript ngầm gán cho channel type là return type của Array.prototype.find là T | undefined. Tức channel possibly undefined. Thật vậy, nếu bạn console.log(channel.id) ngay dưới line 6, bất kể let/const đều ra lỗi.

- vậy tại sao if rồi mà typescript vẫn bắt lỗi? Tại vì TS nghi ngờ bạn có thể set channel = undefined giữa các lần map dù đã pass if. Nếu đổi thành const channel = thì TS sẽ cho qua vì const không set value lại được. Đơn giản vậy thôi.

Cái này là một câu pv junior, k có gì đáng để discuss. Nếu bạn có vào một vài project cũ sẽ có style viết như này.

let obj1 = {...}
Object.keys(obj1).map(key => if(obj1.hasOwn(key)) {//do sth}) cũng là bình thường. Vì obj1 là mutable object, không thể make sure là sau khi bạn lấy ra list key và loop thì obj1 có bị xoá bớt key hay không.
Vậy mà mình đọc mấy top comments trong discuss của bác này đa số đều cho rằng vấn đề liên quan đến closure,scope hoặc sửa lỗi từ let thành const. Thấy bác Dev này tranh luận có ý kiến: liệu hàm map nó có làm mutate channel không. Cảm ơn bác đã giúp mình hiểu, vậy đây là do typescript tự động để đảm bảo tránh bị lỗi nhỉ.
 
Vậy mà mình đọc mấy top comments trong discuss của bác này đa số đều cho rằng vấn đề liên quan đến closure,scope hoặc sửa lỗi từ let thành const. Thấy bác Dev này tranh luận có ý kiến: liệu hàm map nó có làm mutate channel không. Cảm ơn bác đã giúp mình hiểu, vậy đây là do typescript tự động để đảm bảo tránh bị lỗi nhỉ.
Đúng, TS chỉ làm đúng nhiệm vụ của nó thôi. Warning cho những case có thể xảy ra.

Nhiều bạn sẽ thắc mắc là rõ ràng code trong hàm map không set lại channel thì đúng ra TS phải hiểu được và không báo lỗi. Nhưng đó là chúng ta thấy, còn TS k dư dả resource để đi search code xem có thực sự update không, kiểu v
 
Back
Top